博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hacking EV3系列之五:iOS通过BTstack发送message给EV3
阅读量:4124 次
发布时间:2019-05-25

本文共 2602 字,大约阅读时间需要 8 分钟。

 在上一篇文章中,我们已经分析了iOS通过BTstack这个第三方库连接外部蓝牙设备的方法,也就是可以连接EV3了。
那么,在连接成功之后,我们要做的关键就是给EV3发它可以识别的信息。这就需要EV3的通讯协议了。
最基本的协议就在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 UTF8Stringmessage:[message UTF8StringoutBuffer:data];

    

    [bt sendRFCOMMPacketForChannelID:bt.connectedChannelId data:datadataLength:length];

} 

// 发送的BTstack方法

-(BTstackError) sendRFCOMMPacketForChannelID:(uint16_t)connectionID data:(uint8_t*)data dataLength:(uint16_t)length{

if (state < kActivatedreturn BTSTACK_NOT_ACTIVATED;

    

    bt_send_rfcomm(connectionID, data, length);

    

return 0;

} 

ok,这样使用上面的Methods,我们就可以将messsage发送出去。
关于数据的接收,以及command,direct command(我们可以直接发送命令到EV3直接控制EV3)的内容,请看下一篇文章。
敬请期待!
未完待续!
欢迎交流!

转载地址:http://bhapi.baihongyu.com/

你可能感兴趣的文章
RedisTemplate的key默认序列化器问题
查看>>
序列化与自定义序列化
查看>>
ThreadLocal
查看>>
从Executor接口设计看设计模式之最少知识法则
查看>>
OKhttp之Call接口
查看>>
application/x-www-form-urlencoded、multipart/form-data、text/plain
查看>>
关于Content-Length
查看>>
WebRequest post读取源码
查看>>
使用TcpClient可避免HttpWebRequest的常见错误
查看>>
EntityFramework 学习之一 —— 模型概述与环境搭建 .
查看>>
C# 发HTTP请求
查看>>
启动 LocalDB 和连接到 LocalDB
查看>>
Palindrome Number --回文整数
查看>>
Reverse Integer--反转整数
查看>>
Container With Most Water --装最多水的容器(重)
查看>>
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>
Remove Element--原地移除重复元素
查看>>