mosquitto-users team mailing list archive
-
mosquitto-users team
-
Mailing list archive
-
Message #00201
Re: Payload support Unicode/UTF-8? (mosquitto Python client)
Sorry. I should say it crashed "the client on the server side due to payload decode failure"
Your mosquitto broker is healthy :)
On Mar 18, 2013, at 6:40 PM, Roger Light <roger@xxxxxxxxxx> wrote:
> Hi Horace,
>
> I presume you intended this to come to the list rather than just me.
>
>> I tried to pass a Chinese NSString to this method, it actually crashed the
>> server again, Payload print out as ?.
>
> It crashed mosquitto the broker? I'm definitely interested in that!
>
>> So I think the problem happens either
>> when this method creating the payload (using NSUTF8StringEncoding) or when
>> the arguments are passed. I noticed it used [payload length] which is
>> calculating how many char in the string text, is it ok? or it should
>> actually using the length of cstrPayload, which is the UTF8 coded CString?
>
> Ultimately the payload length needs to be the number of bytes in
> cstrPayload, so it seems quite likely you are right that this is where
> the error is occurring.
>
> Cheers,
>
> Roger
>
>
> On Mon, Mar 18, 2013 at 7:50 AM, horace <contactyunkong@xxxxxxxxx> wrote:
>> Thanks a lot for the help Roger.
>>
>> I tried your code on my server, it works smoothly. all Chinese char are
>> displayed correctly. So I start to guess it may caused by the payload string
>> sent from my iPhone app.
>>
>> I am using this wrapper on iPhone to use the libmosquitto (1.1.3):
>> https://github.com/horacex/marquette
>>
>> I noticed in the MosquittoClient class, the publish method looks like this:
>> https://github.com/horacex/marquette/blob/master/Classes/MosquittoClient.m#L156
>>
>> - (void)publishString: (NSString *)payload toTopic:(NSString *)topic
>> withQos:(NSUInteger)qos retain:(BOOL)retain {
>> const char* cstrTopic = [topic
>> cStringUsingEncoding:NSUTF8StringEncoding];
>> const uint8_t* cstrPayload = (const uint8_t*)[payload
>> cStringUsingEncoding:NSUTF8StringEncoding];
>> mosquitto_publish(mosq, NULL, cstrTopic, [payload length], cstrPayload,
>> qos, retain);
>>
>> }
>>
>> I tried to pass a Chinese NSString to this method, it actually crashed the
>> server again, Payload print out as ?. So I think the problem happens either
>> when this method creating the payload (using NSUTF8StringEncoding) or when
>> the arguments are passed. I noticed it used [payload length] which is
>> calculating how many char in the string text, is it ok? or it should
>> actually using the length of cstrPayload, which is the UTF8 coded CString?
>>
>> Will do some test.
>>
>>
>> int mosquitto_publish(struct mosquitto *mosq, int *mid, const char *topic,
>> int payloadlen, const void *payload, int qos, bool retain)
>> {
>> struct mosquitto_message_all *message;
>> uint16_t local_mid;
>>
>> if(!mosq || !topic || qos<0 || qos>2) return MOSQ_ERR_INVAL;
>> if(strlen(topic) == 0) return MOSQ_ERR_INVAL;
>> if(payloadlen < 0 || payloadlen > MQTT_MAX_PAYLOAD) return
>> MOSQ_ERR_PAYLOAD_SIZE;
>>
>> if(_mosquitto_topic_wildcard_len_check(topic) != MOSQ_ERR_SUCCESS){
>> return MOSQ_ERR_INVAL;
>> }
>>
>> local_mid = _mosquitto_mid_generate(mosq);
>> if(mid){
>> *mid = local_mid;
>> }
>>
>> if(qos == 0){
>> return _mosquitto_send_publish(mosq, local_mid, topic, payloadlen, payload,
>> qos, retain, false);
>> }else{
>> message = _mosquitto_calloc(1, sizeof(struct mosquitto_message_all));
>> if(!message) return MOSQ_ERR_NOMEM;
>>
>> message->next = NULL;
>> message->timestamp = time(NULL);
>> message->direction = mosq_md_out;
>> if(qos == 1){
>> message->state = mosq_ms_wait_puback;
>> }else if(qos == 2){
>> message->state = mosq_ms_wait_pubrec;
>> }
>> message->msg.mid = local_mid;
>> message->msg.topic = _mosquitto_strdup(topic);
>> if(!message->msg.topic){
>> _mosquitto_message_cleanup(&message);
>> return MOSQ_ERR_NOMEM;
>> }
>> if(payloadlen){
>> message->msg.payloadlen = payloadlen;
>> message->msg.payload = _mosquitto_malloc(payloadlen*sizeof(uint8_t));
>> if(!message->msg.payload){
>> _mosquitto_message_cleanup(&message);
>> return MOSQ_ERR_NOMEM;
>> }
>> memcpy(message->msg.payload, payload, payloadlen*sizeof(uint8_t));
>> }else{
>> message->msg.payloadlen = 0;
>> message->msg.payload = NULL;
>> }
>> message->msg.qos = qos;
>> message->msg.retain = retain;
>> message->dup = false;
>>
>> _mosquitto_message_queue(mosq, message);
>> return _mosquitto_send_publish(mosq, message->msg.mid, message->msg.topic,
>> message->msg.payloadlen, message->msg.payload, message->msg.qos,
>> message->msg.retain, message->dup);
>> }
>> }
>>
>>
>> On Mar 18, 2013, at 1:01 AM, Roger Light <roger@xxxxxxxxxx> wrote:
>>
>> Hi Horace,
>>
>> Is there any chance you could post a non-working demo? I've just put
>> together an example that works: https://gist.github.com/oojah/5182443
>> Could you give that a try as well? It would be good to know where
>> things are going wrong.
>>
>> Regards,
>>
>> Roger
>>
>>
Follow ups
References