← Back to team overview

mosquitto-users team mailing list archive

Re: Payload support Unicode/UTF-8? (mosquitto Python client)

 

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