最基本的协议就在c_com.h这个文件中。
这里我们以向EV3发message这种最简单的形式来看一下协议是如何使用了。
先摘录一段c_com.h中关于发message协议的内容。
1.基本的发送协议
General Protocol Overview\verbatim
,------,------,------,------,------,------,------,------,
|Byte 0|Byte 1|Byte 2|Byte 3| | | |Byte n|
'------'------'------'------'------'------'------'------'
Byte 0 – 1: Command size, Little Endian\n
Byte 2 – 3: Message counter, Little Endian\n
Byte 4: Command type. The 7 lowest bit of this byte is used for identifying the command type.
Bit 7 (MSB) is used for identifying whether the command should give a reply message or not.
Byte 5 - n: Dependent on command type
2. 发message的协议
WRITEMAILBOX:
-------------
Bytes sent to another brick:
Mailbox name has to be zero terminated but name length has to be number of chars excluding
the zero termination.
xxxxxxxx819Exxxxxxxxxxxxxxxxxxxx
bbbbmmmmttssllaaaaa...LLLLppp...
bbbb = bytes in the message, mmmm = message counter, tt = type of message, ss = system command,
ll = Name Length, aaa... = Name, LLLL = Payload length, ppp... = Payload
从上面我们已经可以很清楚地看出这个数据的协议格式了。
有了这个格式,下面我们需要的就是编写一个方法来实现这个message的内容。
// 组织message的方法
- (int)messageWithMailboxName:(const char*)mailboxName
message:(const char*)msg
outBuffer:(unsigned char *)outBuffer
{
outBuffer[2] = 0x00; // message count
outBuffer[3] = 0x00;
outBuffer[4] = 0x81; // command not reply
outBuffer[5] = 0x9e; // write mailbox command
int cur_p = 6; // cursor, to count bit
int size = strlen(mailboxName) + 1;
outBuffer[cur_p++] = size;
memcpy(&outBuffer[cur_p], mailboxName, size);
cur_p+=size;
size = strlen(msg) +1;
outBuffer[cur_p++] = size & 0xff;
outBuffer[cur_p++] = (size & 0xff00) >> 8;
memcpy(&outBuffer[cur_p], msg, size);
cur_p+=size;
outBuffer[0]=(cur_p - 2)&0xff;
outBuffer[1]=((cur_p - 2)&0xff00) >> 8;
return cur_p;
}
// 发送message的方法
- (void)sendMessage:(NSString *)message title:(NSString *)title
{
BTstackManager *bt = [BTstackManager sharedInstance];
uint8_t data[bt.mtu];
uint16_t length = [self messageWithMailboxName:[title UTF8String] message:[message UTF8String] outBuffer:data];
[bt sendRFCOMMPacketForChannelID:bt.connectedChannelId data:datadataLength:length];
}
// 发送的BTstack方法
-(BTstackError) sendRFCOMMPacketForChannelID:(uint16_t)connectionID data:(uint8_t*)data dataLength:(uint16_t)length{
if (state < kActivated) return BTSTACK_NOT_ACTIVATED;
bt_send_rfcomm(connectionID, data, length);
return 0;
}
ok,这样使用上面的Methods,我们就可以将messsage发送出去。
关于数据的接收,以及command,direct command(我们可以直接发送命令到EV3直接控制EV3)的内容,请看下一篇文章。
敬请期待!
未完待续!
欢迎交流!