原理

1.首先理解什么是YModem通讯?

YModem协议是XModem的改进协议,它最用于调制解调器之间的文件传输的协议,具有快速,稳定传输的优点。它的传输速度比XModem快,这是由于它可以一次传输1024字节的信息块,同时它还支持传输多个文件,也就是常说的批文件传输。

YModem分成YModem-1K与YModem-g。

我使用的是YModem-1K 也就是一次传输1024字节。

YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。

YModem-g传输形式与YModem-1K差不多,但是它去掉了数据的CRC校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK信号,而直接传输下一个数据块。正是它没有涉及错误校验,才使得它的传输速度比YModem-1K来得块。

一般都会选择YModem-1K传输,平时所说的YModem也是指的是YModem-1K。下面就讲讲它的传输协议

由于上面都是些 C语言相关的所以省略了直接进入主题。 2.理解传输数据格式

/*** ========================================================================================* THE YMODEM:* Send 0x05>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* 发送0x05* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C* SOH 00 FF "foo.c" "1064'' NUL[118] CRC CRC >>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C* STX 01 FE data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* ACK STX 02 FD data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* ACK STX 03 FC data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* STX 04 FB data[256] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* SOH 05 FA data[100] 1A[28] CRC CRC>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NAK* EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C* SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK* ===========================================================================================**/

我们用的设备首先要发送0x05与蓝牙通讯 然后设备返回一个C 接受到C后立即发送头部包到设备 此处 需要CRC16校验 采用标准的欧美标准

接下来就可以依次进行数据发送

注意:每一个公司的协议是不一样的但是你理解原理之后 协议不管怎么改 都可以去解决。

发送YModem到蓝牙的关键代码 根据底层的协议去进行发送数据

//接受终端数据然后再发送数据到终端
- (void)setOTADataWithOrderStatus:(NSString *)status fileName:(NSString *)filename {//发送头包if([status isEqual:OTAC]){NSLog(@"Head");NSData *data_first = [self prepareFirstPacketWithFileName:filename];if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data_first];}}//发送第一包 和 最后的结束包 ACK/Celse if([status isEqual:OTASTART]){if(index_packet>0){NSData *data = [self prepareEndPacket];if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data];}index_packet = OTAUPEND;}else{// 正式包数组 获取所有拆解包放入数组中存储if (self.packetArray.count==0) {self.packetArray = [self preparePacketWithFileName:filename];}NSData *data = self.packetArray[index_packet];//写入蓝牙数据if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data];}index_packet_cache = index_packet;}}//接受到ACKelse if([status isEqual:OTAACK]){if(index_packet==OTAUPEND){NSLog(@"升级完成");}index_packet++;NSLog(@"ACK");if (index_packet < self.packetArray.count) {if (index_packet != index_packet_cache) {self.packetArray = [self preparePacketWithFileName:filename];NSData *data = self.packetArray[index_packet];//拆包发送if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data];}}index_packet_cache = index_packet;}else{Byte byte4[] = {0x04};NSData *data23 = [NSData dataWithBytes:byte4 length:sizeof(byte4)];NSLog(@"准备结束第一次OTA");if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data23];}}//沉睡300ms[NSThread sleepForTimeInterval:0.5];}//接受到NAK的时候else if([status isEqual:OTANAK]){if(index_packet>0){Byte byte4[] = {0x04};NSData *data23 = [NSData dataWithBytes:byte4 length:sizeof(byte4)];NSLog(@"准备结束第二次OTA");if([self.delegate respondsToSelector:@selector(onWriteBleData:)]){[self.delegate onWriteBleData:data23];}}else{NSLog(@"升级失败了");}}//通过代理返回当前你的升级大小if(self.packetArray.count>0){if([self.delegate respondsToSelector:@selector(onCurrent:onTotal:)]){[self.delegate onCurrent:index_packet onTotal:self.packetArray.count];}}
}

具体的详细过程 请看YYModemOCDemo

https://github.com/ArdWang/YModemlib_iOS

如果你喜欢就给我个star吧 目前更新到 v2.0.0版本

https://github.com/ArdWang/YModemOCDemo

iOS—YModem蓝牙固件升级相关推荐

  1. iOS 蓝牙固件升级

    升级介绍 蓝牙固件升级是使用手机给固件进行版本升级,以达到修复bug或者添加新功能的作用.升级的大概流程是:首先,当蓝牙固件需要升级时,由嵌入式开发人员提供新的固件,由服务器管理人员将固件放到服务器上 ...

  2. iOS:蓝牙通讯开发快速上手

    1. 思维导图 蓝牙知识的结构图 蓝牙数据通讯流程图 2. 苹果对蓝牙设备的要求 BLE:bluetouch low energy,蓝牙4.0设备因为低功耗,所有也叫作 BLE.苹果在 iPhone ...

  3. 关于IOS的蓝牙(转)

    关于IOS的蓝牙 首先,你要了解你的目的是什么,一般的IOS蓝牙开发有以下三种目的: 1. IOS设备和IOS设备之间交互 好消息是:ios6.0可以把iPhone手机当从设备了,可以两台iPhone ...

  4. iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计

    iOS简易蓝牙对战五子棋游戏设计思路之一--核心蓝牙通讯类的设计 一.引言 本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方信息交互框架的设计 ...

  5. iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法

    2019独角兽企业重金招聘Python工程师标准>>> iOS简易蓝牙对战五子棋游戏设计思路之二--核心棋盘逻辑与胜负判定算法 一.引言 上一篇博客我们介绍了在开发一款蓝牙对战五子棋 ...

  6. IOS开发-蓝牙实战项目-汪亮-专题视频课程

    IOS开发-蓝牙实战项目-4475人已学习 课程介绍         该视频面向有一定开发经验的IOS开发人员,视频主要通过实际上线项目,讲解蓝牙的搜索,连接,手机发送数据,手机接收数据,并处理返回的 ...

  7. iOS蓝牙开发(三):iOS中蓝牙模块OTA升级(YModem协议)

    上一篇简单介绍了蓝牙4.0的iOS实现代码,详细的东西大家可以去github上搜babyBluetooth,里面有一些学习资料,接下来分享的是OTA升级的东西,我们假定看这篇文章的时候,关于iOS和外 ...

  8. android蓝牙固件升级_AirPods Pro 如何升级固件开启「空间音频」?为何「空间音频」未生效?如何体验「空间音频」?...

    (。・∀・)ノ゙嗨,各位,一般来到这篇文章的都是新购买了 AirPods Pro 的同学,先恭喜你们和我一样拥有了最最适合 iPhone (iPad)的无线降噪耳机,这耳机真的太美妙了 没有购买的赶紧 ...

  9. iOS开发 蓝牙技术4.0详解

    前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE ...

最新文章

  1. 全球自动驾驶汽车发展指数哪家强?美德领衔,中国第七
  2. 如何使用 50 行 Python 代码制作一个计算器
  3. c++STL容器的Queue
  4. java 死循环排查_java应用死循环排查方法或查找程序消耗资源的线程方法(面试)...
  5. 美国科学院公布新一批院士名单,中科院曹晓风及五名华裔教授当选
  6. 什么原因导致百度搜索比Google要少很多?
  7. sqlserver 导入mysql,在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合...
  8. 从ext2文件系统上读出超级块
  9. Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
  10. mac上超好用的文字转语音工具【迅捷文字转语音】
  11. Cocos游戏打包apk
  12. 鲸探发布点评:9月21日发售高分一号、七号卫星数字藏品
  13. 个人GitHub学生认证经验分享
  14. 基于小程序开发的藏书馆
  15. 树莓派 电脑通过界面远程控制
  16. 用户画像场景与技术实现方案
  17. 资产管理3大重要性,你还不知道吗?
  18. Android 6.0以上动态申请文件读写权限
  19. python pass的含义
  20. 二进制与八进制、十进制、十六进制之间的相互转换

热门文章

  1. 小区物业管理系统(含源文件)
  2. Reading intermittently wrong data from core.Try slower target speed
  3. 我们正在酝酿什么?3CX 未来计划
  4. Decoupling the Depth and Scope of Graph Neural Networks(ShaDow-GNN)论文阅读笔记
  5. 消息队列RabbitMQ之初学者
  6. 保护小学生这件事上,腾讯拿出全球最严防沉迷措施
  7. 《全基因组测序WGS数据分析——4.构建WGS主流程》学习笔记
  8. python selenium 爬取去哪儿网的数据
  9. 免费下载中国地图china.js,在VUE使用echarts-map全国地图的方法和源码
  10. 实验九 3D编程基础