康耐视移动条码SDK(cmbSDK)是开发移动条码扫描应用程序的工具。CmbSDK基于康涅视的DataMan技术和Manatee Works条形码扫描SDK,允许您在移动设备上创建条形码扫描应用程序。用于条形码扫描的移动设备支持智能手机、平板电脑和MX系列工业条形码阅读器。CmbSDK通过一个CMBReaderDevice连接层。一旦应用程序建立了与阅读器的连接,一个单一和统一的API作为配置设备的接口,无需编写太多的条件代码。
CmbSDK提供了两个基本的CMBReaderDevice连接层:
cmbSDK支持康耐视的MX系列移动终端,具有使用cmbSDK的功能:
提交关于https://cmbdn.cognex.com/mfi/apply为你想要发布到app Store的每个iOS应用。当应用名称和捆绑包ID固定时,你可以提前创建MFi请求,这样你就可以加快之后发布到app Store的过程。
一旦你的MFI产品计划请求被处理,你会收到电子邮件通知进一步的步骤,届时你可以直接向苹果提交应用程序。
在向app Store提交应用之前更新应用注释:
将您的移动设备(手机或平板电脑)通过USB或lightning端口连接到您的PC,开始调试。如果MX移动终端在应用程序运行时通过USB或lightning端口连接到移动设备,则需要通过Wi-Fi调试应用程序。
先决条件:
如果你用XCode运行你的应用程序,确保你的设备通过闪电线插入并启用通过网络连接在移动设备上:
现在您可以关闭设备窗口并开始调试您的应用程序,而不使用闪电线或USB。
先决条件。
启动应用程序后,您可以安全地拔下插头,并通过Wi-Fi继续调试会话。
如果没有硬件触发器,移动设备必须使用替代方法来启动条形码扫描。cmbSDK支持三种方式触发条码扫描:
内置摄像头在移动设备的显示屏上提供实时流预览,可以是部分或全屏,纵向或横向,用于条形码瞄准。重新定位移动设备,直到条形码出现在内置摄像头的视野中,应用程序对其进行解码。
cmbSDK支持无源瞄准器:连接到移动设备或其外壳上的设备,使用设备的LED闪光灯作为光源来投射瞄准或瞄准模式。移动设备可以投射一个类似于专用扫描仪的瞄准器模式,因此不需要实时预览。
此外,CmbSDK支持一个主动瞄准器,它有自己的内置led照明和瞄准:MX-100条形码阅读器。MX-100是iOS智能手机的移动设备配件,通过移动设备外壳连接到移动设备上。MX-100内置的LED投影出一个绿色的点,以帮助读取条形码。
cmbSDK支持纵向方向、横向方向和自动旋转,以显示条形码预览和扫描方向。不管应用程序和移动设备的方向如何,移动设备都可以扫描大多数条形码。
为了获得更好的读取性能,在纵向上读取QR、Data Matrix和Maxicode,在横向上读取PDF417这样的长代码。
cmbSDK针对移动环境进行了优化,但图像分析和条形码解码仍然是CPU密集型活动。由于这些进程与移动操作系统(OS)、服务和其他应用程序共享移动设备的CPU,因此以下进程优化条形码扫描应用程序,并将其限制为仅使用它们所需的cmbSDK特性。
优化应用程序:
设置你的应用程序使用iOS cmbSDK:
打开XCode,开始一个新项目。
* SystemConfiguration.framework * AVFoundation.framework * CoreGraphics.framework * CoreMedia.framework * CoreVideo.framework * MediaPlayer.framework * Security.framework * AudioToolbox.framework * cmbSDK.framework
去你的项目Info.plist文件并添加隐私-摄像头使用说明或NSCameraUsageDescription显示一条关于应用程序如何使用用户移动设备的摄像头的消息。
如果您正在使用MX移动终端的cmbSDK,还需要添加支持的外部附属协议或UISupportedExternalAccessoryProtocols来com.cognex.dmcc在项目的Info.plist.(在这种情况下,你必须在苹果应用商店发布应用之前创建MFi请求。你可以阅读更多的细节让MX移动终端应用进入应用商店部分。)
cmbSDK旨在为支持的扫描设备提供高级抽象接口。这不仅包括MX系列移动终端,还包括打算使用移动设备相机作为成像设备的应用程序。与这些设备通信和管理的复杂性被封装在SDK本身中:让应用程序连接到所选择的设备,然后使用它。
应用程序和受支持的条形码扫描设备之间的主要接口是CMBReaderDevice类。该类代表设备本身的抽象层,处理所有通信以及任何必要的硬件管理(例如,智能手机扫描)。
cmbSDK的使用方法如下:
为要使用的设备类型初始化一个读取设备:MX读取器或相机读取器。
连接阅读器设备。
配置读取器(如果需要)。
开始扫描。
初始化、连接和配置通常只需要在应用程序中执行一次,除了以下情况:
初始化CMBReaderDevice使用MX移动终端,如MX-1000, MX-1100,或MX-1502是很容易的:简单地使用MX设备方法创建阅读器设备(不需要参数),并设置适当的委托(通常是self):
让readerDevice:CMBReaderDevice = CMBReaderDevice. readerofmx () readerDevice.delegate = self
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfMXDevice];readerDevice.delegate = self;
MX移动终端的可用性可能会在设备打开或关闭时发生变化,或者在闪电电缆连接或断开时发生变化。您可以使用以下方法处理这些更改CMBReaderDeviceDelegate方法。
func availabilityDidChange(ofReader reader: CMBReaderDevice)
- (void)availabilityDidChangeOfReader:(CMBReaderDevice *)reader
如果你想连接到网络上的康耐视设备(例如手持或固定安装),你必须使用另一个名为NetworkDiscovery.这个框架可以在cmbSDK包中找到。
使用移动设备的内置摄像头进行条形码扫描可能比使用MX移动终端更复杂。因此cmbSDK支持多种配置,以提供最大的灵活性,包括支持可选的外部瞄准镜和照明,以及自定义直播流预览外观的能力。MX-100是iPhone的外部设备,我们称之为主动瞄准器。
若要使用MX-100或移动设备的内置摄像头扫描条形码,请初始化CMBReaderDevice对象使用readerOfDeviceCameraWithCameraMode静态方法。相机读取器初始化时有几个选项。需要配置以下参数:
* CDMCameraMode * CDMPreviewOption * UIView
的CameraMode参数的类型CDMCameraMode(定义在CDMDataManSystem.h),并接受以下值之一:
上述模式为作为代码阅读器的移动设备提供了以下默认设置:
根据所选择的模式,将设置以下附加选项和行为:
的previewOptions参数(类型)CDMPreviewOption,定义为CDMDataManSystem.h)用于更改读取器的默认值或覆盖从选定对象派生的默认值CameraMode.在传递参数时,可以通过OR-ing指定多个选项。可用的选项如下:
kCDMPreviewOptionHighResolution:使用分辨率较高的设备摄像头帮助扫描小条码,但解码时间较慢。该选项在支持该选项的设备上将分辨率设置为1920x1080,在不支持该选项的设备上将分辨率设置为默认值。默认分辨率为1280x720。
例子:
创建一个没有瞄准器和全屏直播预览的阅读器:
let readerDevice:CMBReaderDevice = CMBReaderDevice。readerOfDeviceCamera (: CDMCameraMode。noAimer previewOptions: CDMPreviewOption。init(rawValue: 0), previewView:nil) readerDevice.delegate = self
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfDeviceCameraWithCameraMode:kCDMCameraModeNoAimer previewOptions:kCDMPreviewOptionDefaults previewView:nil];readerDevice.delegate = self;
创建一个没有瞄准器,没有缩放按钮,并使用模拟触发器的阅读器:
let readerDevice:CMBReaderDevice = CMBReaderDevice。readerOfDeviceCamera (: CDMCameraMode。noAimer previewOptions: [CDMPreviewOption。noZoomBtn CDMPreviewOption。hwTrigger], previewView:nil) readerDevice.delegate = self
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfDeviceCameraWithCameraMode:kCDMCameraModeNoAimer previewOptions:(kCDMPreviewOptionNoZoomBtn | kCDMPreviewOptionHwTrigger) previewView:nil];readerDevice.delegate = self;
初始化CMBReaderDevice并设置一个委托来处理来自阅读器的响应。
然后使用connectWithCompletion:
//如果self.readerDevice.availability == CMBReaderAvailibilityAvailable{//在readerDevice对象和设备self.readerDevice. available之间创建连接,则确保设备已经打开并准备就绪。连接(完成:{(错误:错误?)在if错误!= nil{//处理连接错误}})}
//如果(readerDevice.)可用性== CMBReaderAvailibilityAvailable){//创建readerDevice对象和设备之间的连接[readerDevice connectWithCompletion:^(NSError *error) {if (error){//处理连接错误}}];}
当连接connectionStateDidChangeOfReader在委托中调用,您可以在阅读器设备中检查连接状态connectionState参数。应该是这样CMBConnectionStateConnected,这表示您已成功连接到CMBReaderDevice,可以开始使用康耐视移动条码SDK。
为了在连接到设备后更改一些设置,cmbSDK提供了一组高级的、与设备无关的api,用于设置和检索设备的当前配置。
使用MX阅读器和相机阅读器进行扫描的区别将在以下部分详细说明。
MX系列移动终端提供了复杂的设备配置和管理,包括保存在设备上的配置。MX设备是康耐视预先配置的,大多数符号和功能都可以使用。
如果您想要自定义配置,请通过DataMan安装工具或Cognex快速安装重新配置。这两种工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序能够配置MX设备,让您选择:
cmbSDK使用一组默认选项用于移动设备的内置摄像头读取条形码。然而,有两个重要的区别需要记住:
MX-100是一款仅适用于iphone的设备外壳附件,为内置摄像头提供了额外的功能,如瞄准功能和更好的照明控制。作为MX设备和内置扫描仪的混合,MX-100具有存储在设备上的瞄准器强度、照明强度和瞄准器调制的设置,而其余的设置,如符号设置,存储在cmbSDK中。看到MX-100用户指南获取更多信息。
以下是使用MX-100设备时要记住的一些事情:
控件的以下方法可以启用单个符号CMBReaderDevice对象:
-(void) setSymbology:(CMBSymbology) symbolology enabled:(bool)enabled completion:(void (^)(NSError *error))completionBlock;
此方法中用于符号参数的所有符号都可以在CMBReaderDevice.h.
例子
self.readerDevice。setsymbsymbologyqr (CMBSymbologyQR, enabled: true, completion: {(_ error: error ?) -> Void in if error != nil{//启用该符号失败,可能原因是:阅读器断开,电池或电缆未插,或当前阅读器设备不支持符号}})
[readerDevice setsymbsymbologyqr enabled:YES completion:^(NSError *error){if (error){//启用该符号失败,可能原因为:reader断开连接,电池或电缆未插拔,或当前readerDevice不支持符号}}];
同样的方法也可以用来关闭符号:
self.readerDevice。setsymbsymbologyupcean (CMBSymbologyUpcEan, enabled: false, completion: {(_ error: error ?) -> Void in if error != nil{//启用该符号失败,可能原因为:阅读器未连接,电池或电缆未插拔,或当前阅读器设备不支持符号}})
[readerDevice setsymbsymbologyupcean enabled:NO completion:^(NSError *error){if (error){//启用该符号失败,可能原因为:reader断开连接,电池或电缆未插拔,或当前readerDevice不支持符号}}];
如果您的阅读器设备配备了照明(例如led),您可以使用以下方法在扫描开始时控制它们是打开还是关闭CMBReaderDevice对象:
self.readerDevice.setLightsON(true){(错误:错误?)in if error != nil{//启动照明失败,可能原因是:阅读器断开,电池或电缆未插电,或设备没有照明灯}}
[readerDevice setLightsON:YES completion:^(NSError *error) {if (error){//开启照明失败,可能原因是:阅读器断开,电池没电或电缆未插电,或设备没有照明灯}}];
请记住,并非cmbSDK支持的所有设备和设备模式都允许照明控制。例如,如果使用内置相机在被动瞄准模式,照明是不可用的,因为LED是用于瞄准。
如果内置摄像头用作阅读器设备,您可以配置缩放级别并定义使用这些缩放级别的方式。
手机摄像头有3个缩放级别,分别是:
你可以用“SET CAMERA”来定义这些缩放级别。ZOOM-PERCENT [100-MAX] [100-MAX]命令。它配置两个级别将放大的百分比。100是不变焦的,MAX(达到1000)将放大到设备能够放大的范围。第一个参数用于设置1级缩放,第二个参数用于设置2级缩放。
当你想检查当前设置时,你可以使用“GET CAMERA”。zoom - percent”,返回两个值:一级缩放和二级缩放。
例子
readerDevice.dataManSystem() ?。sendCommand(“设置相机。缩放比例250 500")
[readerDevice。dataManSystem sendCommand:@“SET CAMERA.”Zoom-percent 250 500";
下面是另一个命令,设置你想要使用的缩放级别或返回实际设置:"GET/SET CAMERA. "变焦0 - 2”。
SET命令的取值包括:
您可以在扫描之前或甚至在扫描期间调用此命令,缩放将上升到配置的级别。
扫描完成后,值重置为正常值(0)。
例子
readerDevice.dataManSystem() ?。sendCommand(“设置相机。放大2”)
[readerDevice。dataManSystem sendCommand:@“SET CAMERA.”放大2”);
当使用移动设备的内置摄像头时,cmbSDK允许您在预览容器中或全屏查看摄像头预览。此预览还包含一个覆盖,可以自定义。cmbSDK相机覆盖层由用于缩放、闪光、关闭扫描仪(全屏)的按钮、指示扫描超时的进度条和相机预览角上的线条构建而成。有两种可用的覆盖:遗留和CMB覆盖。
使用cmbSDK v2.0中使用的传统相机覆盖。xand the ManateeWorks SDK, use this property from MWOverlay before initializing theCMBReaderDevice:
MWOverlay.setOverlayMode (Int32 (OM_LEGACY.rawValue))
[MWOverlay setOverlayMode OM_LEGACY):;
如果使用CMB覆盖,你可以在Resources/layout目录中找到布局文件:必威随行版官网
CMBScannerPartialView.xib当扫描程序在容器内启动时使用(部分视图)
CMBScannerView.xib当扫描仪全屏启动时
复制您需要的布局文件,或两个布局,然后根据需要修改它们。更改视图的大小、位置或颜色,删除视图,并添加自己的视图,如叠加图像。cmbSDK使用的视图(缩放、闪光、关闭按钮、用于在角落上绘制线条的视图和进度条)由sdk使用标签属性,确保标签属性保持不变,以便cmbSDK能够识别视图并继续正确地工作。
CMB和遗留的覆盖层都允许您更改缩放和闪光按钮上使用的图像。要做到这一点,首先复制assets文件夹MWBScannerImages.xcassets从资源目录进入您的必威随行版官网项目。在XCode中,你可以查看这个资产文件夹中包含的图像,并在保持图像名称不变的情况下将它们替换为你自己的图像。
CMB和LEGACY覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。下面是一个如何做到这一点的例子:
MWOverlay.setLocationLineUIColor (UIColor.yellow) MWOverlay.setLocationLineWidth (5)
[MWOverlay setLocationLineUIColor UIColor.yellowColor):;[MWOverlay setLocationLineWidth: 5];
每个康耐视扫描设备都实现了DataMan控制命令(DMCC),这是一种配置和控制设备的方法。实际上,该设备的所有功能都可以使用这种基于文本的语言进行控制。API提供了向设备发送DMCC命令的方法。存在用于设置和查询配置属性的命令。
附录A包括完整的DMCC参考使用相机阅读器。其他受支持设备(例如MX-1000)的DMCC命令包含在该特定设备的文档中。
附录B提供与相应DMCC设置相关的相机读取器配置设置的默认值。
下面的示例显示了将不同的DMCC命令发送到设备以进行更高级的配置。
例子:
将扫描方向改为全向:
self.readerDevice.dataManSystem() ?。sendCommand(“设置解码器。1D-SYMBOLORIENTATION 0", withCallback: { (response:CDMResponse?) in if response?.status == DMCC_STATUS_NO_ERROR { // Command was executed successfully } else { // Command failed, handle errors here } })
[readerDevice。dataManSystem sendCommand:@"SET DECODER.1D-SYMBOLORIENTATION 0" withCallback:^(CDMResponse *response){if (response. 0)status == DMCC_STATUS_NO_ERROR){//命令执行成功}else{//命令执行失败,处理错误}}];
修改直播预览扫描超时时间为10秒:
self.readerDevice.dataManSystem() ?。sendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10",在if响应中使用callback:{(响应:CDMResponse?)status == DMCC_STATUS_NO_ERROR{//命令执行成功}否则{//命令执行失败,处理错误}})
[readerDevice。dataManSystem sendCommand:@"SET DECODER. "MAX-SCAN-TIMEOUT 10" withCallback:^(CDMResponse *response){if(响应。status == DMCC_STATUS_NO_ERROR){//命令执行成功}else{//命令执行失败,处理错误}}];
获取连接设备的类型:
self.readerDevice.dataManSystem() ?。sendCommand(“设备。类型", withCallback: { (response:CDMResponse?) in if response?.status == DMCC_STATUS_NO_ERROR { // Command was executed successfully let deviceType:String = response?.payload } else { // Command failed, handle errors here } })
[readerDevice。dataManSystem sendCommand:@"获取设备。类型" withCallback:^(CDMResponse *response){ if (response.status == DMCC_STATUS_NO_ERROR) { // Command was executed successfully NSString *deviceType = response.payload; } else { // Command failed, handle errors here } }];
cmbSDK包括一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置,而在内置摄像头的情况下,这些是附录B中标识的默认值,其中不启用任何符号。方法如下:
self.readerDevice.resetConfig {(error: error ?) in if error != nil{//重置配置失败,可能原因:阅读器断开,电池没电或线缆未插拔}}
[readerDevice resetConfigWithCompletion:^(NSError *error) {if (error){//重置配置失败,可能原因为:reader断连,电池没电或线缆未插接}}];
有了正确配置的阅读器,就可以扫描条形码了。方法可以简单地实现这一点startScanning ()方法。CMBReaderDevice对象。接下来会发生什么是基于类型CMBReaderDevice以及它是如何配置的。一般来说:
当满足下列条件之一时,扫描停止:
当条形码被成功解码时,您将收到一个CMBReadResults数组的CMBReaderDevice的使用以下方法进行委托CMBReaderDeviceDelegate方法:
func didReceiveReadResult(fromReader reader: CMBReaderDevice, results readResults: CMBReadResults!)
- (void)didReceiveReadResultFromReader:(CMBReaderDevice *)reader results:(CMBReadResults *)readResults;
要简单地显示ReadResult扫描条形码后:
func didReceiveReadResult(fromReader reader: CMBReaderDevice, results readResults: CMBReadResults!) {if readResults.readResults.count > 0 {let readResult:CMBReadResult = readResults.readResults?首先是!如果readResult. CMBReadResult。图像!= nil { self.ivPreview.image = readResult.image } if readResult.readString != nil { self.lblCode.text = readResult.readString } } }
- (void)didReceiveReadResultFromReader:(CMBReaderDevice *)reader results:(CMBReadResults *)readResults {if (readResults.readResults. resultfromreader)count > 0) {CMBReadResult *readResult = readResults.readResults.firstObject;if (readResult.image) {self.ivPreview.image = readResult.image;} if (readResult.readString) {self.lblCode.text = readResult.readString;}}}
在上面的例子中,ivPreview是一个UIImageView用于显示扫描条形码的图像,和lblCode是一个UILabel,用于显示条形码的结果。你也可以使用BOOL fromreadResult.goodRead检查扫描是否成功。
当条码读取成功时,aCMBReadResult对象创建并返回didReceiveReadResultFromReader:结果:方法。在单个图像/帧上成功读取多个条形码的情况下,多个CMBReadResult返回对象。这就是为什么CMBReadResults类的数组CMBReadResult对象,其中包含所有结果。
的CMBReadResult类具有描述条形码读取结果的属性:
当扫描结束而未成功读取时,aCMBReadResult返回与goodRead属性设置为false。这通常发生在扫描被取消或超时时。
以启用映像和imageGraphics属性CMBReadResult对象,则必须设置相应的imageResultEnabled和/或SVGResultEnabled的属性CMBReaderDevice对象.
要查看关于如何并行使用和显示图像和SVG图形的示例,请参阅SDK包中提供的示例应用程序。
要从扫描的条形码中访问原始字节,可以使用XML属性。字节被存储为“full_string”标签下的Base64字符串。下面是一个如何使用iOS XML解析器从XML属性中提取原始字节的示例。
例子:
解析XML并提取Base64字符串是使用xmlparse
// XMLParserDelegate var currentElement = "" var base64String = "" func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qName:字符串?,属性attributeDict: [String: String] = [:]) {currentElement = elementName} func解析器(_ parser: XMLParser, foundCharacters String: String) {if currentElement == "full_string" {base64String = String}}
#pragma NSXMLParserDelegate;NSString * base64String;- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {currentElement = elementName;} - (void)解析器:(NSXMLParser *)解析器foundCharacters:(NSString *)字符串{if ([currentElement isEqualToString:@"full_string"]) {base64String =字符串;}}
在您设置XMLParserDelegate为了从XML结果中提取base64字符串,您需要创建一个xmlparse对象并使用此委托解析result.xml。中接收扫描结果时可以执行此操作CMBReaderDeviceDelegate,或访问CMBReadResult对象。下面是你如何使用你之前创建的委托来获取原始字节:
let xmlParser: xmlParser = xmlParser。init(data: result.xml) xmlParser.delegate = self if xmlParser.parse(){//通过变量let bytes访问原始字节:data ?=数据。初始化(base64Encoded: base64String)}
NSXMLParser *xmlParser = [NSXMLParser。]alloc initWithData result.XML):;xmlParser.delegate = self;if ([xmlParser parse]){//通过变量NSData *bytes = [NSData. parse]访问原始字节。alloc initWithBase64EncodedString:base64String options:0];}
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时,CMBReadResults不会在相应的属性中包含任何数据。
要启用图像结果,请使用以下方法从CMBReaderDevice类中设置imageResultEnabled属性:
self.readerDevice.imageResultEnabled = true
[readerDevice setImageResultEnabled:是的);
要启用SVG结果,请使用以下方法从CMBReaderDevice类设置imageResultEnabled属性:
self.readerDevice.svgResultEnabled = true
[readerDevice setSVGResultEnabled:是的);
可能会出现由于电池电量不足或手动断开电缆而导致设备断开的情况。这些情况可以通过connectionStateDidChangeOfReader的回调CMBReaderDeviceDelegate.
从非活动状态返回应用程序后,阅读器设备保持初始化,但没有连接。不需要重新初始化SDK,但需要重新连接。
某些iOS版本会在恢复应用程序时发送“可用性”通知,说明外部附件可用。你可以在CMBReaderDeviceDelegate方法:(void)availabilityDidChangeOfReader:(CMBReaderDevice *)reader so w当阅读器可用时,您就可以连接了。
例如:
func availabilityDidChange(ofReader阅读器:CMBReaderDevice) {if(阅读器。available == CMBReaderAvailibilityAvailable) {readerDevice. available == CMBReaderAvailibilityAvailable)连接(completion: { error in if error != nil { // handle connection error } }) } }
- (void)availabilityDidChangeOfReader:(CMBReaderDevice *)reader {if (readerDevice.)availability == CMBReaderAvailibilityAvailable) {[readerDevice connectWithCompletion:^(NSError *error) {if (error){//处理连接错误}}];}}
有些iOS版本不会在简历上报告可用性变化,所以你需要手动处理。为UIApplicationDidBecomeActiveNotification和连接。
例子:
override func viewDidLoad() {super.viewDidLoad() //当应用程序恢复时重新连接NotificationCenter.default.addObserver(self, selector: #selector(self. appbecameactive), name:NSNotification.Name。UIApplicationDidBecomeActive,对象:nil)} //处理应用程序恢复func appBecameActive() {if readerDevice != nil && readerDevice。availability == CMBReaderAvailibilityAvailable && reader设备。connectionState!= CMBConnectionStateConnecting && readerDevice.connectionState != CMBConnectionStateConnected { readerDevice.connect(completion: { error in if error != nil { // handle connection error } }) } }
- (void)viewDidLoad{//当应用程序恢复时重新连接[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appBecameActive) name:UIApplicationDidBecomeActiveNotification object:nil];} //处理应用程序恢复-(无效)appBecameActive {if (readerDevice != nil && readerDevice.}availability == CMBReaderAvailibilityAvailable && reader设备。connectionState!= CMBConnectionStateConnecting && readerDevice.connectionState != CMBConnectionStateConnected) { [readerDevice connectWithCompletion:^(NSError *error) { if (error) { // handle connection error } }]; } }
下表列出了使用内置摄像头进行条码扫描时cmbSDK支持的各种DMCC命令。
获取/设置 |
命令 |
参数(年代) |
描述 |
默认值 | 只复位设备? | MX终端 |
mx - 100 |
---|---|---|---|---|---|---|---|
得到 |
电池。负责 |
(0 - 100) |
显示当前电池水平的百分比。 |
N/A | x |
||
哔哔的声音 |
重复 (0 - 3) 水平 (0 - 2) |
播放“哔”声(音)。 |
N/A | x |
|||
获取/设置 |
哔哔的声音。好 |
哔哔声次数 (0 - 3) beep语气 (0 - 2) |
设置哔哔声的数量和哔哔声的音调/音调:低,中,高。 对于内置摄像头,只有一个单一的哔哔声,不支持螺距控制。 0 1关闭提示音,11 1打开提示音。 |
11 1打开“哔”声 |
x |
||
获取/设置 | 相机。变焦 | 0 - 2 | SET命令的值是: 0 -正常(无缩放) 1 -缩放到一级, 2 -放大到2级。 扫描时使用缩放级别。扫描结束时,缩放级别重置为0。 |
N/A | |||
获取/设置 | 相机。变焦-PERCENT | 1级 (100 - max) 2级 (100 - max) |
获取或设置相机变焦的百分比: 级别1:默认200% 级别2:默认400%
注意:确保至少从SDK启动相机一次,以获得适当的最大变焦(max)值。 |
N/A | |||
获取/设置 |
CODABAR。CODESIZE |
任何 最小值 马克斯 |
[ON | OFF]接受任意长度的Codabar。 [1-max]设置可接受Codabar的最小长度 |
N/A | x | ||
获取/设置 | CODABAR。QZ-SIZE | 0 - 100 | 安静区单一严格大小。 | 50 | X | ||
获取/设置 | CODABAR。验证 | (|关闭) | 打开/关闭Codabar条形码验证。 | 在 | |||
获取/设置 |
C11。CHKCHAR |
[on | off] |
代码11打开/关闭。 |
从 | |||
获取/设置 |
C11。CHKCHAR-OPTION |
(0 - 1) |
0表示不启用。 |
1 | x | ||
获取/设置 |
C11。CODESIZE |
任何 最小值 马克斯 |
[ON|OFF]接受任何长度的编码11。 [1-max]设置接受Code 11的最小长度。 |
N/A | x | ||
获取/设置 | C11。验证 | (|关闭) | 打开/关闭Code 11条形码的验证。 | 在 | |||
获取/设置 | C128。验证 | (|关闭) | 打开/关闭Code 11条形码的验证。 | 在 | |||
获取/设置 |
这件。CODESIZE |
任何 最小值 马克斯 |
代码25代码大小。对于cmbSDK,所有Code 25变体使用相同的最小长度;因此它将接受C25。CODESIZE或I205.CODESIZE [ON|OFF]接受任意长度的编码25。 [1-max]设置接受Code 25的最小长度。 |
N/A | x | ||
获取/设置 | 这件。QZ-SIZE | 0 - 100 | 安静区单一严格大小。注意C25。QZ-SIZEand I2O5.QZ-SIZE are the same setting for the camera API. | 50 | X | ||
获取/设置 | 这件。验证 | On | off | 打开/关闭代码25和交叉的5个条形码中的2个的验证。 | 在 | |||
获取/设置 |
C39。美国信息交换标准代码 |
(|关闭) |
打开/关闭Code 39扩展ASCII。 |
从 | x |
||
获取/设置 |
C39。CODESIZE |
任何 最小值 马克斯 |
[ON|OFF]接受任何长度的编码39。 [2|4-max]设置接受Code 39的最小长度。(2是使用摄像头API的最小值,4是MX移动终端的最小值) 将代码大小设置为2-3是有风险的,因为它可能导致误读。 |
N/A | x |
||
获取/设置 |
C39。CHKCHAR |
(|关闭) |
代码39检查字符。 |
从 | x |
||
获取/设置 | C39。验证 | (|关闭) | 打开/关闭Code 39条形码的验证。 | 在 | |||
获取/设置 |
C93。美国信息交换标准代码 |
(|关闭) |
打开/关闭代码93扩展ASCII |
从 | |||
获取/设置 |
C93。CODESIZE |
任何 最小值 马克斯 |
[ON|OFF]接受任何长度的代码93。 [1-max]设置接受93码的最小长度。 |
N/A | x |
||
获取/设置 | C93。验证 | (|关闭) | 打开/关闭代码93条形码的验证。 | 从 | |||
配置。默认的 |
将大多数相机API设置重置为默认值。设备标识和通信设置没有改变。要重置所有设置,请使用DEVICE.DEFAULT。 |
N/A | x |
||||
配置。保存 | 将当前配置保存到非易失性内存(仅MX-1xxx)。注意,当MX关机或进入睡眠模式时,当设备唤醒时,最后保存的配置将恢复。 | N/A | |||||
配置。恢复 | 从非易失性内存中恢复保存的配置(仅限于MX-1xxx)。 | N/A | |||||
获取/设置 |
数据。结果类型 |
0 1 2 4 8 |
指定要返回的结果(多个值的和):无 文本字符串结果(默认) XML结果 XML数据 扫描图像(见image)。*命令) |
1 | x |
||
获取/设置 |
DATABAR。扩大 |
(|关闭) |
打开/关闭数据库扩展符号。 |
从 | x |
||
获取/设置 |
DATABAR。有限的 |
(|关闭) |
打开/关闭DataBar Limited符号。 |
在 | x |
||
获取/设置 |
DATABAR。集团 DATABAR。RSS14 |
(|关闭) |
打开/关闭DataBar GROUP(在cmbSDK 2.4.2之前称为RSS14)符号。 |
从 | x |
||
获取/设置 |
DATABAR。RSS14STACK |
(|关闭) |
打开/关闭DataBar RSS14堆叠符号。cmbSDK 2.4.2已弃用,使用DATABAR。集团。 |
从 | |||
获取/设置 | DATABAR。验证 | (|关闭) | 打开/关闭数据库条形码验证。 | 在 | |||
获取/设置 |
DECODER.1D——SYMBOLORIENTATION |
0 1 2 3. |
使用全向扫描定位。 使用水平和垂直扫描方向。 使用垂直扫描方向。 使用水平扫描方向。 |
1 | x |
||
获取/设置 | 译码器。CENTERING-WINDOW | (0 - 100) (0 - 100) (0 - 100) (0 - 100) |
定心窗口的位置和大小占传感器尺寸的百分比。 水平居中为居中窗口的百分比 垂直居中为居中窗口的百分比 水平大小为居中窗口的百分比 垂直尺寸为定心窗口的百分比 |
x | x | ||
获取/设置 | 译码器。DISPLAY-TARGET | (|关闭) | 显示居中窗口图形。 | 从 | x | x | |
获取/设置 |
译码器。努力 |
(0 - 5) |
设置图像分析/解码的努力级别。
注意:不要使用4-5进行在线扫描。 |
2 | |||
获取/设置 |
译码器。MAX-SCAN——超时 |
(0 - 120) |
设置直播预览的超时时间。当超时时,解码暂停,直播预览将保持在屏幕上。 |
60 | |||
得到 | 译码器。MAX-THREADS | 返回设备支持的最大CPU线程数。 | N/A | ||||
获取/设置 | 译码器。REREAD-TIME | (0 - 10000) | 代码重读延迟(毫秒)。 | 1000 | x | x | |
获取/设置 | 译码器。ROI-PERCENT | (0 - 100) (0 - 100) (0 - 100) (0 - 100) |
感兴趣区域的位置和大小占相机视图大小的百分比: 水平中心为ROI百分比 水平大小为ROI的百分比 垂直中心作为ROI的百分比 垂直大小为ROI的百分比 |
N/A | x | ||
获取/设置 | 译码器。TARGET-DECODING | (|关闭) | 启用目标解码,读取与目标解码窗口重叠的代码。 | 从 | x | x | |
获取/设置 | 译码器。线色 | (0-MAX) | 指定扫描程序在扫描过程中可以使用的最大CPU线程数。 | N/A | |||
获取/设置 | 译码器。USE-CENTERING | (|关闭) | 只读取居中窗口内的代码。 | 从 | x | x | |
设备。默认的 |
将相机API设置重置为默认值。 |
x |
|||||
得到 |
设备。FIRMWARE-VER |
获取设备固件版本。 |
N/A | x |
|||
得到 |
设备。ID |
字符串 |
返回由康耐视分配给扫描设备的设备ID。 对于内置相机,SDK返回53。 对于MX-100条码扫描器,SDK返回56。 |
N/A | x |
||
获取/设置 |
设备。的名字 |
返回分配给设备的名称。 |
mx - DEVICE.SERIAL-NUMBER的最后6位。 | x |
|||
得到 |
设备。串行-数 |
返回设备的序列号。 对于内置相机,SDK分配一个伪随机数。 |
N/A | x |
|||
得到 |
设备。类型 |
返回由康耐视分配给扫描设备的设备名称。 对于内置相机,SDK返回“MX-Mobile”。 如果MX-100可用,SDK返回“MX-100”。 |
N/A | x |
|||
获取/设置 |
的焦点。FOCUSTIME |
(清廉) |
设置相机的自动对焦周期(相机应该尝试重新对焦的频率)。 对于MX-100,默认值是1。 |
3. | x |
x | |
获取/设置 |
I2O5。CHKCHAR |
(|关闭) |
将交错的5个检查数字中的2个打开/关闭。 |
从 | x |
||
获取/设置 |
I2O5。CODESIZE |
任何 最小值 马克斯 |
对于cmbSDK,所有Code 25变体使用相同的最小长度;因此它将接受C25。CODESIZE或I205.CODESIZE [ON|OFF]接受任意长度的交错2 / 5。 [1-max]设置可接受的交错2 / 5的最小长度。 |
N/A | x | ||
获取/设置 | I2O5。QZ-SIZE | 0 - 100 | 安静区单一严格大小。注意C25。QZ-SIZEand I2O5.QZ-SIZE are the same setting for the camera API. | 50 | X | ||
获取/设置 | I2O5。验证 | (|关闭) | 打开/关闭交错的2 / 5和代码25条形码的验证。 | 在 | |||
获取/设置 |
的形象。格式 |
0 1 2 |
扫描器以位图格式返回图像结果。 扫描器以JPEG格式返回图像结果。 扫描仪返回PNG格式的图像结果。 |
1 | x |
||
获取/设置 |
的形象。质量 |
[10,15,20,…90] |
指定JPEG图像质量。 |
50 | x |
||
获取/设置 |
的形象。大小 |
0 1 2 3. |
扫描仪返回全尺寸图像。 扫描仪返回1 / 4大小的图像。 扫描仪返回1/16大小的图像。 扫描仪返回1/64大小的图像。 |
1 | x |
||
获取/设置 |
光。瞄准手 |
(0 - 1) |
当扫描仪启动时禁用/启用瞄准器。 基于cameraMode的默认值: 0: NoAimer和FrontCamera 1:被动瞄准器和主动瞄准器 |
在 | x |
||
集 | 光。瞄准手-CONFIG | (32 - 100) (0-15) (32 - 100) |
设置MX-100的配置 瞄准手强度, 瞄准手调制, 光照强度 |
N/A | x | ||
得到 | 光。瞄准手-CONFIG | (0 - 1) | 一次性获得所有MX-100配置参数。 0:从cache中读取Settings 1:始终从设备读取。 |
N/A | x | ||
获取/设置 | 光。瞄准手-INTENSITY | (32 - 100) | 设置/获取瞄准器LED的强度百分比。 | N/A | |||
获取/设置 | 光。瞄准手-MODULATION | (0-15) | 设置/获取瞄准器LED的调制(眨眼频率),单位为毫秒。 | N/A | |||
获取/设置 |
光。瞄准手-TIMEOUT |
(0 - 600) |
瞄准手的超时时间(秒)。 这个值总是被DECODER覆盖。MAX-SCAN——超时。 |
60 | x |
||
获取/设置 |
光。内部,使 |
(|关闭) |
启用/禁用照明。 |
从 | x |
||
获取/设置 |
MSI。CHKCHAR |
[on | off] |
打开/关闭MSI Plessey检查数字。 默认值为OFF。 |
N/A | x |
||
获取/设置 |
MSI。CHKCHAR-OPTION |
0 |
使用mod 10校验和 |
N/A | x | ||
获取/设置 |
MSI。CODESIZE |
模式 最小值 马克斯 |
[ON|OFF]接受任何长度的MSI Plessey。 [1-max]设置可接受MSI Plessey的最小/最大长度。 [min-80]设置可接受MSI Plessey的最小/最大长度。 |
N/A | x | ||
获取/设置 | MSI。QZ-SIZE | 0 - 100 | 安静区单一严格大小。 | 50 | X | ||
获取/设置 | MSI。验证 | [on | off] | 打开/关闭MSI条形码验证。 | 在 | |||
获取/设置 | QR。微 | [on | off] | 打开/关闭QR微符号 | 从 | X | ||
获取/设置 |
的象征。AZTECCODE |
[on | off] |
打开/关闭阿兹特克代码符号。 |
从 | x |
||
获取/设置 |
的象征。CODABAR |
[on | off] |
打开/关闭Codabar符号。 |
从 | x |
||
获取/设置 |
的象征。C11 |
[on | off] |
打开/关闭代码11符号。 |
从 | |||
获取/设置 |
的象征。C128 |
[on | off] |
打开/关闭代码128符号。 |
从 | x |
||
获取/设置 |
的象征。这件 |
[on | off] |
打开/关闭Code 25符号(标准)。 |
从 | x |
||
获取/设置 |
的象征。C39 |
[on | off] |
打开/关闭Code 39符号。 |
从 | x |
||
获取/设置 | 的象征。C39-CONVERT-TO-C32 | [on | off] | 启用/禁用Code39到Code32的转换。 | 从 | x | x | |
获取/设置 |
的象征。C93 |
[on | off] |
打开/关闭代码93符号。 |
从 | x |
||
获取/设置 |
的象征。鸡笼 |
[on | off] |
打开/关闭COOP符号(代码25变体)。 |
从 | |||
获取/设置 |
的象征。DATAMATRIX |
[on | off] |
打开/关闭数据矩阵符号。 |
从 | x |
||
获取/设置 |
的象征。DATABAR |
[on | off] |
打开/关闭DataBar符号。也检查DATABAR。组,DATABAR。有限的, DATABAR.EXPANDED to check which subtypes are read if Databar is turned on. |
从 | x |
||
获取/设置 |
的象征。DOTCODE |
[on | off] |
打开/关闭DotCode符号。 |
从 | x |
||
获取/设置 |
的象征。国际航空运输协会 |
[on | off] |
打开/关闭IATA符号(代码25变体)。 |
从 | |||
获取/设置 |
的象征。倒 |
[on | off] |
打开/关闭反转符号(代码25变体)。 |
从 | |||
获取/设置 |
的象征。ITF14 |
[on | off] |
打开/关闭ITF-14符号(代码25变体)。 |
从 | |||
获取/设置 |
的象征。UPC-EAN |
[on | off] |
开启/关闭UPC-A、UPC-E、EAN-8和EAN-13符号。 |
从 | x |
||
获取/设置 |
的象征。矩阵 |
[on | off] |
打开/关闭矩阵符号(代码25变体)。 |
从 | |||
获取/设置 |
的象征。MAXICODE |
[on | off] |
打开/关闭MaxiCode符号。 |
从 | |||
获取/设置 |
的象征。MSI |
[on | off] |
打开/关闭MSI Plessey符号。 |
从 | x |
||
获取/设置 |
的象征。PDF417 |
[on | off] |
打开/关闭PDF417符号。 |
从 | x |
||
获取/设置 |
的象征。地球 |
[on | off] |
打开/关闭PLANET符号。 |
从 | x |
||
获取/设置 |
的象征。POSTNET |
[on | off] |
打开/关闭POSTNET符号。 |
从 | x |
||
获取/设置 | 的象征。TELEPEN | [on | off] | 打开/关闭TELEPEN符号。 | 从 | x | ||
获取/设置 | SYMBOL.4STATE-AUS | [on | off] | 打开/关闭澳大利亚邮件符号。 | 从 | x | ||
获取/设置 |
SYMBOL.4STATE-IMB |
[on | off] |
打开/关闭智能邮件条形码符号。 |
从 | x |
||
获取/设置 |
SYMBOL.4STATE-RMC |
[on | off] |
打开/关闭皇家邮政编码符号。 |
从 | x |
||
获取/设置 |
的象征。QR |
[on | off] |
打开/关闭QR和MicroQR符号。 |
从 | x |
||
获取/设置 | TELEPEN。FORCE-NUMERIC | [on | off] | 仅打开/关闭数字Telepen符号的读取。 | 从 | |||
获取/设置 | TELEPEN。验证 | [on | off] | 打开/关闭Telepen条形码验证。 | 从 | |||
获取/设置 |
触发器。类型 |
0 1 2 3. 4 5 |
不支持 不支持 手册(默认) 不支持 不支持 连续 |
N/A | x |
||
获取/设置 |
UPC-EAN。EAN13 |
[on | off] |
打开/关闭EAN-13符号。 |
在 | |||
获取/设置 |
UPC-EAN。EAN8 |
[on | off] |
打开/关闭EAN-8符号。 |
在 | |||
获取/设置 |
UPC-EAN。UPC-A |
[on | off] |
打开/关闭UPC-A符号。 |
在 | |||
获取/设置 |
UPC-EAN。UPC-E |
[on | off] |
打开/关闭UPC-E符号。 |
在 | |||
获取/设置 |
UPC-EAN。UPCE1 |
[on | off] |
打开/关闭UPC-E1符号。 |
从 | x |
||
获取/设置 |
UPC - EAN。补充 |
0 1 - 4 |
关闭UPC补充代码。打开UPC补充代码。 |
N/A | x |
||
获取/设置 | UPC-EAN。验证 | [on | off] | 打开/关闭UPC条形码验证。 | 从 | |||
获取/设置 | 振动。好 | [on | off] | 设置/获取读取代码时是否震动(默认为ON) | N/A | x |