カスタム デバイス (STM32F405/GPRS モジュール) に PAHO 組み込み C ライブラリを実装しようとしています。
私の主な問題は、バッファーにソースを使用するカスタム recv() 関数を作成することです。
PAHO ライブラリの例では、transport_getdata() 関数があります。トランスポート層を処理します。これはtranport_getdata()関数です。この例では、私が持っていないソケットライブラリを使用しています:(
int transport_getdata(unsigned char* buf, int count)
{
int rc = recv(mysock, buf, count, 0);
//printf("received %d bytes count %d\n", rc, (int)count);
return rc;
}
ライブラリをプロジェクトに移植するには、my_recv() のような独自の recv() 関数を作成する必要があります。
Standardd socket Recv() 関数の説明によると、
Recv() は、ソースからバッファに書き込まれたメッセージの長さを返します。
そこで、 recv() を置き換えるために my_recv() を書き込もうとしました (ソケット ID と FLAG は必要ありません)。
int my_recv(char *buf, int len){
int i=0;
if (len <= 0 )
return -1;
if (len > BUF_MAX)
len=BUF_MAX - 2;
for(i=0;i<len;i++){
*buf=serial_buffer[0];
*buf++;
//shift one byte buffer to left
memmove(serial_buffer, serial_buffer+1,(BUF_MAX-1)*sizeof(*serial_buffer));
interrupt_pointer--; // After one byte shift, reduce serial interrupt pointer.
}
return i;
}
TCP 着信データを処理し、GPRS モジュールを介してシリアル/TCP 透過接続を使用しています。
割り込みを使用して、シリアルからすべてのバイトを読み取り、serial_buffer に書き込まれたすべての受信バイトを読み取りました。
void USART1_IRQHandler(void){
int byte;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Received characters modify string
{
byte= USART_ReceiveData(USART1);
}
serial_buffer[interrupt_pointer]=byte;
interrupt_pointer++;
if(interrupt_pointer==BUF_MAX){
interrupt_pointer=0;
memset(serial_buffer,0,BUF_MAX);
}
}
簡単なテストのために、TCP ソケット経由で「1234567890」を送信します。
簡単なテストコードは
while(strlen(serial_buffer)>0){
delay_ms(1000);
printf("%s\r\n",serial_buffer);
my_recv(buf,3);
printf("%s\r\n",buf);
printf("%s\r\n",serial_buffer);
}
私のシステムアウトは、
1234567890 // All TCP data received
123 // getting 3 bytes from buffer
4567890 // remaining bytes
recv() 関数をよく理解しているかどうかはわかりません。これでアウトプットOKです。
それでも、PAHO ライブラリを使用して MQTT パッケージを処理することはできません。