Xamarin的独特之处就在于它提供了一种语言——c#、类库和运行时,可以在iOS、Android和Windows Phone这三个移动平台上运行(Windows Phone的原生语言已经是c#),同时仍然编译原生(非解释性的)应用程序,即使是高要求的游戏,其性能也足够好。
每个平台都有不同的特性集,编写本机应用程序的能力也各不相同——也就是说,编译成本机代码并与底层Java子系统流畅互操作的应用程序。例如,有些平台只允许用HTML和JavaScript构建应用程序,而有些平台非常低级,只允许C/ c++代码。有些平台甚至不使用本机控制工具包。
Xamarin的独特之处在于它结合了原生平台的所有功能,并添加了一些自己的强大功能,包括:
Xamarin提供两种商业产品:Xamarin。iOS和Xamarin.Android。它们都是建立在莫诺,一个基于已发布的。net ECMA标准的。net框架的开源版本。Mono诞生的时间几乎和。net框架本身一样长,几乎可以在所有可以想到的平台上运行,包括Linux、Unix、FreeBSD和Mac OS X。
在iOS平台上,Xamarin的提前(AOT编译器编译Xamarin。iOSapplications directly to native ARM assembly code. On Android, Xamarin’s compiler compiles down to中间语言(伊尔),即当时即时(JIT)在应用程序启动时编译到本机程序集。
在这两种情况下,Xamarin应用程序都利用一个运行时来自动处理诸如内存分配、垃圾收集、底层平台互操作等事情。
Xamarin的。形式is a framework that allows developers to rapidly create cross platform user interfaces. It provides it's own abstraction for the user interface that will be rendered using native controls on iOS, Android, Windows, or Windows Phone. This means that applications can share a large portion of their user interface code and still retain the native look and feel of the target platform.
Xamarin的。形式allows for rapid prototyping of applications that can evolve over time to complex applications. Because Xamarin.Forms applications are native applications, they don't have the limitations of other toolkits such as browser sandboxing, limited APIs, or poor performance. Applications written using Xamarin.Forms are able to utilize any of the API’s or features of the underlying platform, such as (but not limited to) CoreMotion, PassKit, and StoreKit on iOS; NFC and Google Play Services on Android; and Tiles on Windows. In addition, it's possible to create applications that will have parts of their user interface created with Xamarin.Forms while other parts are created using the native UI toolkit.
Xamarin的。形式applications are architected in the same way as traditional cross-platform applications. The most common approach is to use便携式图书馆或共享项目存放共享代码,并创建将使用共享代码的平台特定应用程序。
在Xamarin.Forms中创建用户界面有两种技术。第一种技术是完全使用c#源代码创建ui。第二个技巧是使用可扩展应用程序标记语言(XAML),一种用于描述用户界面的声明性标记语言。有关XAML的更多信息,请参见XAML基础知识.
注意:因为限制,你不能在Xamarin中使用Xamarin热重启功能使用我们的SDK。如果你是在windows机器上开发,你需要与MAC代理配对,以便构建和运行你的项目。
要开始开发Xamarin应用程序,首先需要安装Visual Studio或Xamarin Studio,并确保包含所有必要的Xamarin组件。在我们的示例中,我们将使用Visual Studio向您展示如何开发Xamarin应用程序并使用我们的SDK。导航到这个链接一步一步地阅读如何下载和安装用于Xamarin应用程序的Visual Studio。
打开Visual Studio并遵循以下步骤:
1.去File ->新建->项目。
2.选择Android应用程序(Xamarin),设置项目名称并从模板中选择空白应用程序
在创建一个空白的应用程序后,创建所有您将使用的资源(图标、图像、样式、布局等)。必威随行版官网你可以从我们的样品中复制。
接下来右键单击你的项目文件,然后单击属性,进入Android Manifest部分。
设置你的Manifest文件(应用程序名称,应用程序图标,最小和最大android版本),确保为这个应用程序启用摄像头权限。
我们发布了我们的SDK作为nuget包https://www.nuget.org.请安装Cognex。
注意:如果到目前为止您使用的是本地XamarinDataManLibrary.dll,而现在您想要更新SDK,请首先删除对XamarinDataManLibrary.dll的引用,然后安装nuget包。
要在没有MX移动终端的移动设备上使用cmbSDK进行条形码扫描,您需要安装许可密钥。如果许可证密钥丢失,将显示星号而不是扫描结果。
有关如何获取许可证密钥(包括30天试用许可证)的信息,请与您的康耐视销售代表联系。
在获得许可证密钥后,有两种方法可以在应用程序中添加许可证密钥。
第一个是在创建readerDevice时直接从代码中实现激活:
...如果(param_deviceClass = = DataManDeviceClass.PhoneCamera ) { //*************************************************************************************** // 创建一个相机读者/ / / /注意:如果我们使用内置摄像头扫描/ /手机或平板电脑,然后SDK需要许可证密钥。参考// SDK的文档获取许可密钥以及//将密钥传递给SDK的方法(在本例中,我们依赖于// AndroidManifest中的条目——也有getPhoneCameraDevice方法,它可以作为参数传递//)。//*************************************************************************************** readerDevice = readerDevice。GetPhoneCameraDevice(这个,param_cameraMode, PreviewOption。默认值,null, "SDK_KEY");}
第二是在应用程序的AndroidManifest.xml文件的application标签下添加以下行:
<应用>…
1.首先根据你的需求构建你的UI,但要考虑以下方面:
我们的示例应用程序(可以在cmbSDK包中找到)使用全屏预览。要更改示例应用程序以使用部分视图,请添加以下内容使用在结束内部主RelativeLayout inactivity_scanner.xml文件。使用这个布局作为一个ViewGroup读取设备构造函数中的参数(getPhoneCameraDevice)当读取器设备初始化时。
2.设置以下接口来监视读取器的连接状态并接收关于读取代码的信息:
公共类ScannerActivity: AppCompatActivity, IOnConnectionCompletedListener, IReaderDeviceListener, ionsymbolylistener, DataManSystem。IOnResponseReceivedListener ActivityCompat。{…#region ReaderDevice监听器实现//当MX-1xxx设备变得可用(USB线被插入,或MX设备被打开)时调用,//或当以前可用的MX-1xxx变得不可用(USB线被拔出,由于不活动或电池耗尽而关闭)公共void OnAvailabilityChanged(ReaderDevice阅读器){if (reader. getavailability () == availabilityavailable . available) {ConnectToReaderDevice();} else if (reader.GetAvailability() ==可用性。构建器警报= new AlertDialog.Builder(this);alert .SetTitle("Device was unavailable") .SetPositiveButton("OK", (sender, e) => {}) .Create() .Show();OnConnectionCompleted(ReaderDevice ReaderDevice, Throwable error){//如果我们有有效的连接错误参数将为null,//否则,这里是错误,通知我们的问题,我们有连接到阅读器设备如果(错误!= null){//要求相机权限如果必要如果(错误是CameraPermissionException) ActivityCompat.RequestPermissions(((ScannerActivity)this),新字符串[]{Android.Manifest.Permission.Camera}, REQUEST_PERMISSION_CODE);UpdateUIByConnectionState ();}} //当与readerDevice的连接被更改时调用。// readerDevice仅在“ConnectionState”中可用。连接ed" state public void OnConnectionStateChanged(ReaderDevice reader) { ClearResult(); if (reader.ConnectionState == ConnectionState.Connected) { // We just connected, so now configure the device how we want it ConfigureReaderDevice(); } isScanning = false; UpdateUIByConnectionState(); } // This is called after scanning has completed, either by detecting a barcode, canceling the scan by using the on-screen button or a hardware trigger button, or if the scanning timed-out public void OnReadResultReceived(ReaderDevice readerDevice, ReadResults results) { ClearResult(); if (results.SubResults != null && results.SubResults.Count > 0) { foreach (ReadResult subResult in results.SubResults) { CreateResultItem(subResult); } } else if (results.Count > 0) { CreateResultItem(results.GetResultAt(0)); } isScanning = false; btnScan.Text = "START SCANNING"; resultListAdapter.NotifyDataSetChanged(); } #endregion ..
3.实例化一个ReaderDevice对象。
使用以下工厂方法为MX阅读器初始化一个Reader Device对象:
//*************************************************************************************** // 创建一个MX-1xxx读者(注意,没有许可证密钥 ) //*************************************************************************************** readerDevice = ReaderDevice.GetMXDevice(这个);//当MX设备变为可用/不可用时监听如果(!availabilityListenerStarted) {readerDevice.StartAvailabilityListening();availabilityListenerStarted = true;}
MX移动终端的可用性可以在设备打开或关闭、USB线连接或断开时发生变化。您可以使用以下方法处理这些更改ReaderDeviceListener接口方法:
OnAvailabilityChanged(ReaderDevice reader)
建议使用MX移动终端扫描条码。但是,cmbSDK还支持使用移动设备的内置摄像头。这包括可选的外部瞄准镜或照明的支持,以及直播预览的外观定制。
当使用移动设备内置摄像头扫描条码时,需要初始化ReaderDevice对象使用getPhoneCameraDevice静态方法。摄像机阅读器在初始化时有几个选项。需要设置以下参数:
的上下文参数提供对当前处于的活动的引用。
的CameraMode中定义的CameraMode类型CameraMode.java它接受下表中列出的值之一。
这些模式为读者提供了以下默认设置:
根据选择的模式,设置额外的照明选项和行为,也列在表中。
价值 | 描述 | 照明 | 直播预览 |
---|---|---|---|
NO_AIMER | 初始化阅读器以使用移动设备屏幕上的实时流预览,以便用户可以将条形码定位在摄像机的视场内进行检测和解码。如果移动设备没有瞄准附件,请使用此模式。 | 照明是可用的,一个按钮控制它是可见的实时流预览。 | 显示 |
如果命令被发送到阅读器用于瞄准器控制,则它们将被忽略。 | |||
PASSIVE_AIMER | 初始化阅读器以使用被动瞄准器。在这种模式下,设备屏幕上没有实时流预览,因为瞄准模式是投影的。 | 照明不可用,直播预览没有照明按钮。 | 不显示 |
如果向阅读器发送用于照明控制的命令,则会忽略它们,因为在这种模式下,假定移动设备的内置LED用于瞄准器。 | |||
FRONT_CAMERA | 初始化阅读器以使用移动设备的前置摄像头(如果可用)。使用这个配置要小心,因为大多数前置相机没有自动对焦和照明,提供的图像分辨率明显较低。在此模式下照明不可用。 | 前置摄像头。 | 显示 |
照明是不可用的,直播预览没有照明按钮。 | |||
如果命令被发送到阅读器用于瞄准器或照明控制,它们将被忽略。 |
的PreviewOption参数的类型为PreviewOption中定义的PreviewOption.java,并用于更改阅读器的默认值或覆盖从选定的派生的默认值CameraMode.您可以指定以下选项:
价值 | 描述 |
---|---|
违约 | 接受CameraMode设置的所有默认值。 |
NO_ZOOM_BUTTON | 隐藏直播预览中的缩放按钮,防止用户调整移动设备相机的缩放。 |
NO_ILLUMINATION_BUTTON | 隐藏实时流预览上的照明按钮,防止用户切换照明。 |
HARDWARE_TRIGGER | 启用模拟硬件触发器(音量下降按钮),以便在移动设备上开始扫描。这个按钮只在按下时开始扫描,不需要像专用扫描仪的触发器那样按住,第二次按下它也不会停止扫描过程。 |
停顿了一下 | 如果使用直播预览,则在startScanning ()方法调用,但是直到用户按下屏幕上的按钮启动扫描过程,阅读器才开始解码。 |
ALWAYS_SHOW | 强制显示实时流预览,即使选择了瞄准模式(例如CameraMode == PASSIVE_AIMER)。 |
HIGH_RESOLUTION | 使用更高分辨率的设备摄像头,支持的设备默认分辨率为1280x720,不支持的设备默认分辨率为1920x1080。这有助于扫描小的条形码,但增加了解码时间,因为每帧有更多的数据要处理。 |
HIGH_FRAME_RATE | 使用设备的相机在60帧,而不是默认的30帧,以提供一个更流畅的相机预览。 |
SHOW_CLOSE_BUTTON | 在局部视图中显示关闭按钮。 |
KEEP_PREVIEW_IN_PAUSED_STATE | 读取或超时后将预览保持在暂停状态。 |
的ViewGroup(可选)参数指定直播预览的容器。如果参数为空零时,使用全屏预览。
的RegistrationKey(可选)参数用于使用您拥有的许可密钥对您的SDK进行许可
的CustomData(可选)参数用于自定义跟踪
例子
创建一个没有瞄准器,没有缩放按钮,使用软触发器的阅读器:
readerDevice = readerDevice。GetPhoneCameraDevice(this, CameraMode.NoAimer, PreviewOption.NoZoomButton | PreviewOption.Paused);
这将启动预览与扫描仪暂停和一个软触发按钮切换扫描。按下软触发按钮后,预期的预览效果是这样的:
由于设置了活动符号,图像中的取景器具有活动扫描面。有关更多细节,请参见使象征学.
从Android 6.0及以上版本,您需要向用户请求访问移动设备的内置摄像头的权限。
如果由于权限问题而无法打开相机,则onConnectionCompleted (readerDevice错误)回调函数包含CameraPermissionException在error参数中。方法检查此异常类型运算符操作,并在活动中请求权限。
if (error is CameraPermissionException) ActivityCompat.RequestPermissions(((ScannerActivity) this), new string[] {Android.Manifest.Permission.Camera}, REQUEST_PERMISSION_CODE);
您需要实现ActivityCompat。IOnRequestPermissionResultCallback接口来捕获用户权限结果。
处理用户响应onRequestPermissionsResult(…),您可以使用以下代码重试连接手机摄像头:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults){//权限请求的检查结果。如果用户允许,连接到readerDevice If (requestCode == REQUEST_PERMISSION_CODE) {If (grantResults. If)。长度> 0 && grantResults[0] == Permission.Granted) {if (readerDevice != null && readerDevice. Permission.Granted)ConnectionState != ConnectionState. connected)} else {if (ActivityCompat.ShouldShowRequestPermissionRationale(((ScannerActivity)this), Android.Manifest.Permission.Camera)) {AlertDialog。构建器构建器= new AlertDialog.Builder(this) . setmessage("你需要允许访问相机"). setpositivebutton ("OK", (sender, e) => {ActivityCompat。RequestPermissions(this, new string[] {Android.Manifest.Permission.Camera}, REQUEST_PERMISSION_CODE);}) .SetNegativeButton(“取消”,(发送者,e ) => { });AlertDialog dialog = builder.Create();dialog.Show ();} } } }
连接前,请设置IReaderDeviceListener对象来接收事件:
readerDevice.SetReaderDeviceListener(这个);
此外,您还可以启用从阅读器发送最后触发的图像和SVG:
readerDevice.EnableImage(真正的);readerDevice.EnableImageGraphics(真正的);
方法初始化后调用connect方法ReaderDevice设置listener方法来处理来自阅读器的响应。连接方法需要IOnConnectionCompletedListener参数:
//确认设备是打开的,readerDevice.Connect(ScannerActivity.this);
使用new调用以下侦听器方法ReaderDevice状态信息:
onConnectionStateChanged(ReaderDevice reader);(ReaderDevice reader, Throwable err)
的onConnectionCompleted作为connect参数传递的方法也会在连接过程完成时调用。如果存在连接错误,此方法将提供一个Throwable对象。
连接到扫描设备后,您可能需要更改其一些设置。CmbSDK提供了一组高级的、与设备无关的api,用于设置和检索设备的当前配置。
的方法,可以开始使用正确配置的阅读器扫描条形码StartScanning方法中的ReaderDevice类:
readerDevice.StartScanning ();
您可以停止扫描以下功能:
readerDevice.StopScanning ();
在下列情况之一时停止扫描:
的ReadResults可迭代结果集合对象中成功解码条码时ReaderDevice侦听器方法。的onReadResultReceived监听器方法的调用,要么是因为阅读器解码了条形码,要么是因为扫描过程已经完成。
例子
//在扫描完成后调用,要么通过检测条形码,要么通过使用屏幕上的按钮或硬件触发按钮取消扫描,要么如果扫描超时公共无效OnReadResultReceived(ReaderDevice ReaderDevice, ReadResults results) {ClearResult();如果结果。年代ubResults != null && results.SubResults.Count > 0) { foreach (ReadResult subResult in results.SubResults) { CreateResultItem(subResult); } } else if (results.Count > 0) { CreateResultItem(results.GetResultAt(0)); } isScanning = false; btnScan.Text = "START SCANNING"; resultListAdapter.NotifyDataSetChanged(); }
CmbSDK不启用任何功能象征学默认使用移动设备内置摄像头读取条码。您必须启用应用程序需要扫描的所有条形码符号,以实现最佳的扫描性能。
控件的以下方法可以启用各个符号ReaderDevice类:
readerDevice.SetSymbologyEnabled(最终的符号学符号学,最终的布尔使能,最终的IOnSymbologyListener监听器)Datamatrix, true, null);readerDevice.SetSymbologyEnabled(象征。upocean, true, null);
此方法中用于符号学参数的所有符号学都可以在ReaderDevice.java.
例子
/*启用二维码扫描*/ readerDevice.SetSymbologyEnabled(符号。Qr, true, null);
你也可以使用相同的方法禁用符号:
/ *禁用代码25扫描*/ readerDevice.SetSymbologyEnabled(符号。C25, false, null);
您可以实现方法IOnSymbologiesListener查询符号更改的结果。
public void onsymbolologyenabled (ReaderDevice reader, symbolology symbolology, Java.Lang.Boolean enabled, Throwable error) {if (error != null){/*不成功可能是当前设备不支持符号,或者ReaderDevice和MX设备之间的连接有问题*/}else {// Success}}
如果您的阅读器设备上装有照明灯,您可以控制它们:当扫描开始时,您可以打开或关闭它们。使用Reader Device对象的以下方法:
readerDevice。年代etLightsOn(true, null);
的接口方法IOnLightsListener,为该方法的第二个参数。
公共类ScannerActivity: AppCompatActivity, ....IOnLightsListener……{…public void onLightsOnCompleted(ReaderDevice reader, Java.Lang.Boolean on,可抛出错误){if(错误!= null){//不成功}else{//成功}}
当使用移动设备的内置摄像头作为阅读器时,您可以配置缩放级别及其使用方式。有三种缩放级别:
的设置相机。缩放百分比[100-max] [100-max]命令用于配置两个级别放大的百分比。100不放大,MAX(最高可达1000)放大到设备所能达到的程度。第一个参数用于设置级别1的缩放,第二个用于级别2的缩放。
控件可以检查当前缩放设置让相机。ZOOM-PERCENT命令,该命令返回两个值:第1级和第2级缩放。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。缩放比例250 500”);
获取/设置相机。变焦0 - 2是另一个设置缩放级别或返回实际设置的命令。SET命令可能的值有:
您可以在扫描之前或甚至在扫描期间调用此命令,缩放将上升到配置的级别。如果扫描完成,则该值重置为正常行为(0)。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。放大2”);
当使用移动设备的相机时,cmbSDK允许您在预览容器中或全屏查看相机预览。这个预览还包含一个可定制的覆盖。cmbSDK相机覆盖功能按钮缩放,闪烁和关闭扫描仪,和一个进度条显示扫描超时。
使用cmbSDK v2.0中最初使用的遗留相机覆盖。在初始化readerDevice之前,从MWOverlay中使用这个属性:
MWOverlay。OverlayMode = mwoverlay . overlaymode枚举. omlegacy;
当使用cmbSDK覆盖时:
cmbSDK和遗留覆盖都允许您更改用于缩放和闪光按钮的图像,如果您的图像具有与cmbSDK使用的名称相同的名称。您可以在参考资料/中找到cmbSDK中使用的图像和名称必威随行版官网drawable-mdpi而且drawable-hdpi目录。虽然其他分辨率是可选的,但这两个目录必须包含具有正确名称的图像,这样cmbSDK才能显示正确的图像。
cmbSDK和遗留覆盖都允许您更改检测到条形码时显示的矩形的颜色和宽度。
例子:
MWOverlay。LocationLineColor = Color.Yellow;MWOverlay。LocationLineWidth = 6;
Cognex扫描设备通过DMCC (DataMan Control Commands)对设备进行配置和控制。该设备的每一个功能都可以使用这种基于文本的语言来控制。API提供了向设备发送DMC命令的方法。存在用于设置和查询配置属性的命令。DMC命令适用于所有平台和框架。
的附录包括完整的DMCC参考相机阅读器。
下面的示例展示了发送到设备进行更高级配置的不同DMCC。
例子
//修改扫描方向为全向readerDevice.DataManSystem。SendCommand("SET DECODER.1D-SYMBOLORIENTATION 0", ScannerActivity.this);//修改直播预览的扫描超时时间为10秒readerDevice.DataManSystem。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10",扫描活动。this);
中调用DMCC查询命令并接收它们的响应IOnResponseReceivedListener.onResponseReceived ()方法。
//获取连接的设备类型readerDevice.DataManSystem。SendCommand(“设备。名称”,这个);public void onresponserreceived (DataManSystem DataManSystem, DmccResponse DmccResponse) {if (DmccResponse。错误!= null){//日志失败。e("DMCC_ERR", "获取设备。NAME failed ", dmccResponse.Error.Message);} else{//成功-使用以下结果字段://int mResponseId = dmccResponse.ResponseId;//String mPayLoad = dmccResponse.PayLoad;//byte[] mBinaryData = dmccResponse.GetBinaryData();}}
CmbSDK包括一个将设备重置为默认设置的方法。对于MX移动终端,默认配置为已保存的配置。对于内置相机,默认设置为附录,其中没有启用任何符号。
要重置设备,添加:
readerDevice.ResetConfig(空);
在使用MX移动终端时,我们可以区分三种状态:
方法监视此异步方法的完成情况IOnResetConfigListener接口,为可选参数。
公共类ScannerActivity: AppCompatActivity, ....IOnResetConfigListener……{…public void onResetConfigCompleted(ReaderDevice reader, Throwable error) {if (error != null){//不成功}else{//成功}
当成功读取条码时,onReadResultReceived方法创建并返回一个ReadResult对象。如果在单个图像或帧上成功读取多个条形码,则多个ReadResult对象返回ReadResult对象。
ReadResult类具有描述条形码读取结果的属性:
当扫描结束而没有成功读取时,将触发ReadResult返回的值与IsGoodRead属性设置为false。
控件中填充的Image和ImageGraphics属性ReadResult对象,设置对应的EnableImage ()和/或EnableImageGraphics ()的属性ReaderDevice对象。
要从扫描的条形码访问原始字节,可以使用XML属性。字节以Base64字符串的形式存储在"full_string"标记下。
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时ReadResults在相应的属性中不包含任何数据。
要启用图像结果,请调用EnableImage ()方法中的ReaderDevice对象:
readerDevice.EnableImage(真正的);
要启用SVG结果,请调用EnableImageGraphics ()方法ReaderDevice对象:
readerDevice.EnableImageGraphics(真正的);
如果设备因电池电量不足或手动断开线缆而断开,可以通过onConnectionStateChanged ()的方法IReaderDeviceListener接口。
打开Visual Studio并遵循以下步骤:
1.去File ->新建->项目。
2.选择iOS App (Xamarin),设置项目名称并从模板中选择空白应用程序
在创建一个空白的应用程序之后,创建您将使用的所有资源(图像、故事板、控制器等)。必威随行版官网你可以从我们的样品中复制。
接下来打开你的Info.plist根据你的需要归档和设置一些项目属性(应用程序名称、部署目标、主界面等)。
重要的是要补充相机的许可在Visual Studio中,没有从这里添加此权限的选项。你需要打开你的Info.plist在文本编辑器中添加以下行:
NSCameraUsageDescription 用于扫描的摄像头
如果你使用MX设备作为阅读器,在Info.plist中添加以下协议:
UISupportedExternalAccessoryProtocols com.cognex. cognex. >Dmcc com.demo.data . Dmcc com.demo.data
在app Store上传你的应用之前,请检查这部分内容:让你的MX移动终端应用程序进入应用商店
我们发布了我们的SDK作为nuget包https://www.nuget.org.请安装Cognex。
注意:如果到目前为止您使用的是本地XamarinDataManLibrary.dll,而现在您想要更新SDK,请首先删除对XamarinDataManLibrary.dll的引用,然后安装nuget包。
如果你计划在iOS低于12.2的设备上使用你的应用程序,就需要额外的步骤:
注意:此包仅适用于真实设备。你不能在iOS版本低于12.2的模拟器上测试你的应用程序。
要在没有MX移动终端的移动设备上使用cmbSDK进行条形码扫描,您需要安装许可密钥。如果许可证密钥丢失,将显示星号而不是扫描结果。
有关如何获取许可证密钥(包括30天试用许可证)的信息,请与您的康耐视销售代表联系。
在获得许可证密钥后,有两种方法可以在应用程序中添加许可证密钥。
第一个是在创建readerDevice时直接从代码中实现激活:
//*************************************************************************************** // 创建一个相机读者(内置摄像头或一个mx - 100) / / / /注意:如果我们是连接到一个mx - 100 (cameraMode = = kCDMCameraModeActiveAimer) / /不需要许可证密钥。但是,如果我们使用手机或平板电脑的内置摄像头//进行扫描,那么SDK需要许可证密钥。参考// SDK关于获取许可密钥的文档以及//向SDK传递密钥的方法(在本例中,我们依赖于// plist.info中的条目——也有readerOfDeviceCamera方法,它可以作为参数传递//)。//*************************************************************************************** DataManDeviceClass。PhoneCamera: readerDevice = CMBReaderDevice。ReaderOfDeviceCameraWithCameraMode(cameraMode, CDMPreviewOption.Defaults, null, "SDK_KEY"); break;
第二种方法是将其添加为项目特定值的键Info.plist文件:
MX_MOBILE_LICENSE 您的许可密钥
首先根据你的需求构建你的UI:
如果希望将扫描结果显示为文本,请添加UILabel.
设置以下接口来监视读取器的连接状态并接收关于读取代码的信息:
//---------------------------------------------------------------------------- // 当一个应用被暂停,到扫描装置的连接通过iOS / /自动关闭;因此,当我们被恢复(变为活动)时,我们//必须恢复连接(假设我们有一个)。这是我们用来执行此操作的观察者。//---------------------------------------------------------------------------- 空白AppBecameActive (NSNotification obj){如果(零& & readerDevice readerDevice ! =。可用性== cmbreaderavailability。可用的&& reader设备。ConnectionState!= CMBConnectionState.Connecting && readerDevice.ConnectionState != CMBConnectionState.Connected) { ConnectToReaderDevice(); } } public override void ViewDidLoad() { base.ViewDidLoad(); // Add our observer for when the app becomes active (to reconnect if necessary) NSNotificationCenter.DefaultCenter.AddObserver(UIApplication.DidBecomeActiveNotification, AppBecameActive); } // This is called when a MX-1xxx device has became available (USB cable was plugged, or MX device was turned on), // or when a MX-1xxx that was previously available has become unavailable (USB cable was unplugged, turned off due to inactivity or battery drained) [Export("availabilityDidChangeOfReader:")] public void AvailabilityDidChangeOfReader(CMBReaderDevice reader) { ClearResult(); if (reader.Availability != CMBReaderAvailibility.Available) { ShowAlert(null, "Device became unavailable"); } else { ConnectToReaderDevice(); } } // This is called when a connection with the self.readerDevice has been changed. // The self.readerDevice is usable only in the "CMBConnectionStateConnected" state [Export("connectionStateDidChangeOfReader:")] public void ConnectionStateDidChangeOfReader(CMBReaderDevice reader) { isScanning = false; ClearResult(); if (readerDevice.ConnectionState == CMBConnectionState.Connected) { // We just connected, so now configure the device how we want it ConfigureReaderDevice(); if (connectingAlert != null) { connectingAlert.DismissViewController(true, () => { connectingAlert = null; }); } } else if (readerDevice.ConnectionState == CMBConnectionState.Disconnected && connectingAlert != null) { connectingAlert.DismissViewController(true, () => { connectingAlert = null; }); } UpdateUIByConnectionState(); } // This is called after scanning has completed, either by detecting a barcode, canceling the scan by using the on-screen button or a hardware trigger button, or if the scanning timed-out [Export("didReceiveReadResultFromReader:results:")] public void DidReceiveReadResultFromReader(CMBReaderDevice reader, CMBReadResults readResults) { isScanning = false; btnScan.Selected = false; scanResults.RemoveAllObjects(); if (readResults.SubReadResults != null && readResults.SubReadResults.Length > 0) { scanResults.AddObjects(readResults.SubReadResults); } else if (readResults.ReadResults.Length > 0) { scanResults.Add(readResults.ReadResults[0]); } tableViewSource.SetItems(scanResults); tvResults.ReloadData(); }
实例化CMBReaderDevice对象。
初始化CMBReaderDevice使用MX移动终端,如MX-1000, MX-1100,或MX-1502很容易:只需使用MX设备方法创建阅读器设备(它不需要参数),并设置适当的委托(通常是self):
readerDevice = cm面包设备。readerofmxdevice ();readerDevice。WeakDelegate = this;
MX移动终端的可用性可以在设备打开或关闭时发生变化,或者在闪电电缆连接或断开时发生变化。您可以使用以下方法处理这些更改CMBReaderDeviceDelegate方法。
AvailabilityDidChangeOfReader(cm面包设备阅读器)
使用移动设备的内置摄像头进行条形码扫描可能比使用MX移动终端更复杂。因此,cmbSDK支持多种配置以提供最大的灵活性,包括支持可选的外部瞄准镜和照明,以及自定义直播预览的外观的能力。MX-100是iPhone的外接设备,我们称之为主动瞄准器。
当使用MX-100或移动设备自带摄像头扫描条码时,需要初始化CMBReaderDevice对象使用ReaderOfDeviceCameraWithCameraMode静态方法。摄像机阅读器在初始化时有几个选项。需要设置以下参数:
* CDMCameraMode * CDMPreviewOption * UIView
的CameraMode参数的类型CDMCameraMode,它接受以下值之一:
以上模式为作为代码阅读器的移动设备提供了以下默认设置:
根据选择的模式,设置以下附加选项和行为:
的previewOptions参数(的类型CDMPreviewOption)用于更改阅读器的默认值或覆盖从选定的派生的默认值CameraMode.多个选项可以在传递参数时通过OR-ing来指定。可用的选项如下:
HighResolution:使用分辨率较高的设备摄像头,以帮助扫描较小的条形码,但解码时间较慢。在支持该选项的设备上,该选项将分辨率设置为1920x1080,在不支持该选项的设备上设置为默认分辨率。默认分辨率为1280x720。
例子:
创建一个没有瞄准器和全屏直播预览的阅读器:
readerDevice = CMBReaderDevice.ReaderOfDeviceCameraWithCameraMode(CDMCameraMode。NoAimer CDMPreviewOption。违约,null);readerDevice。WeakDelegate = this;
创建一个没有瞄准器,没有缩放按钮,并使用模拟触发器的阅读器:
readerDevice = CMBReaderDevice.ReaderOfDeviceCameraWithCameraMode(CDMCameraMode。NoAimer CDMPreviewOption。NoZoomBtn|CDMPreviewOption。HwTrigger,零); readerDevice.WeakDelegate = this;
初始化CMBReaderDevice并设置一个委托来处理来自阅读器的响应。
然后使用ConnectWithCompletion:
//确保设备已打开并准备好if (readerDevice. if)可用性== cmbreaderavailability。可用的&& reader设备。ConnectionState== CMBConnectionState.Disconnected) { if (readerDevice.DeviceClass == DataManDeviceClass.PhoneCamera && cameraMode == CDMCameraMode.ActiveAimer) { connectingAlert = UIAlertController.Create("Connecting", null, UIAlertControllerStyle.Alert); PresentViewController(connectingAlert, true, null); } readerDevice.ConnectWithCompletion((error) => { if (error != null) { ShowAlert("Failed to connect", null); } }); }
当连接ConnectionStateDidChangeOfReader在委托中调用,在那里您可以检查您的阅读器设备的连接状态ConnectionState参数。应该是这样的CMBConnectionState,连接,这意味着您已成功地连接到CMBReaderDevice,并可以开始使用康耐视移动条码SDK。
MX系列移动终端提供复杂的设备配置和管理,包括保存在设备上的配置。MX设备配备了Cognex预配置的大多数符号和功能,可以随时使用。
如果需要自定义配置,可以通过DataMan安装工具或Cognex快速安装重新配置。这两个工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序可以配置MX设备,为您提供以下选项:
cmbSDK使用一组默认选项,通过移动设备的内置摄像头来读取条形码。然而,有两个重要的区别需要记住:
MX-100是iphone专用的设备外壳附件,为内置摄像头提供额外功能,如瞄准功能和更好的照明控制。MX-100是MX设备和内置扫描仪的混合,它具有存储在设备上的瞄准器强度、照明强度和瞄准器调制的设置,而其他设置(如符号设置)则存储在cmbSDK中。看到MX-100用户指南更多信息。
以下是使用MX-100设备时需要记住的几点:
控件的以下方法可以启用各个符号CMBReaderDevice对象:
readerDevice.SetSymbology (CMBSymbology。DataMatrix, true, null);
此方法中用于符号学参数的所有符号学都可以在CMBSymbology枚举。
同样的方法也可以用来关闭符号:
readerDevice.SetSymbology (CMBSymbology。DataMatrix, false, null);
如果您的阅读器设备配备了照明(例如led),您可以在扫描开始时使用下列方法控制它们是开还是关CMBReaderDevice对象:
readerDevice。年代etLightsON(true, (error) => { if (error != null) { System.Diagnostics.Debug.WriteLine("// Failed to enable illumination, Possible causes are: reader disconnected, out of battery or cable unplugged, or device doesn't come with illumination lights"); } });
请记住,并非cmbSDK支持的所有设备和设备模式都允许照明控制。例如,如果使用内置相机在被动瞄准模式,照明是不可用的,因为LED被用于瞄准。
如果使用内置摄像头作为阅读器,则可以配置缩放级别并定义使用这些缩放级别的方式。
手机相机有3个变焦级别,分别是:
你可以用“SET CAMERA”来定义这些缩放级别。ZOOM-PERCENT [100-MAX] [100-MAX]命令。它配置两个级别按百分比放大的距离。100是不变焦的,MAX(最高可达1000)将在设备的能力范围内放大。第一个参数用于设置级别1的缩放,第二个用于级别2的缩放。
当你想检查当前设置,你可以用“GET CAMERA”来完成。它返回两个值:第1级和第2级缩放。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。缩放比例250 500”);
这是另一个命令,设置你想要使用的缩放级别或返回实际设置:“GET/SET CAMERA。变焦0 - 2”。
SET命令可能的值有:
您可以在扫描之前甚至扫描期间调用此命令,缩放将上升到所配置的级别。
扫描完成后,这些值重置为正常(0)。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。放大2”);
当使用移动设备的内置摄像头时,cmbSDK允许您在预览容器中或全屏查看摄像头预览。这个预览也包含一个覆盖,可以自定义。cmbSDK摄像头覆盖由用于缩放、闪光、关闭扫描仪(全屏)的按钮、指示扫描超时的进度条和摄像头预览角上的线条组成。有两个可用的覆盖:遗留和CMB覆盖。
使用cmbSDK v2.0中使用的传统相机覆盖层。. x和ManateeWorks SDK,在初始化CMBReaderDevice:
MWOverlay.SetOverlayMode ((int) OverlayMode.Legacy);
如果使用CMB覆盖,你可以在Resources/layout目录中找到布局文件:必威随行版官网
CMBScannerPartialView.xib当扫描程序在容器内启动时使用(部分视图)
CMBScannerView.xib当扫描仪全屏启动时
复制你需要的布局文件,或者两个布局,然后根据你的需要修改它们。改变视图的大小、位置或颜色,删除视图,并添加您自己的视图,如叠加图像。cmbSDK使用的视图(缩放、闪光、关闭按钮、用于在角上画线的视图和进度条)由sdk使用标签属性,确保标签属性保持不变,以便cmbSDK能够识别视图并继续正确地工作。
CMB和遗留覆盖允许你改变图像上使用的缩放和闪光按钮。为此,首先复制资产文件夹MWBScannerImages.xcassets从“资源”目录到您必威随行版官网的项目。在VisualStudio中,您可以查看包含在这个资产文件夹中的图像,并将它们替换为您自己的图像,同时保持图像名称不变。
CMB和LEGACY覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。下面是一个如何做到这一点的例子:
MWOverlay.SetLocationLineUIColor (UIColor.Yellow);MWOverlay.SetLocationLineWidth (5);
每个Cognex扫描设备都实现DataMan控制命令(DMCC),这是一种配置和控制设备的方法。使用这种基于文本的语言,几乎可以控制设备的每一个功能。API提供了向设备发送DMCC命令的方法。存在用于设置和查询配置属性的命令。
附录A包括完整的DMCC参考使用相机阅读器。其他支持的设备(例如MX-1000)的DMCC命令包含在该特定设备的文档中。
附录B提供相机阅读器的配置设置的默认值,与相应的DMCC设置相关。
DMC命令适用于所有平台和框架。
下面的示例展示了将不同的DMCC命令发送到设备以进行更高级的配置。
例子:
将扫描方向改为全向:
readerDevice.DataManSystem。SendCommand(“设置解码器。1D-SYMBOLORIENTATION 0", (response) => { if (response.Status == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
修改直播预览扫描超时时间为10秒:
readerDevice.DataManSystem。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10",(响应)=> {if(响应)。年代tatus == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
获取连接设备的类型:
readerDevice.DataManSystem。SendCommand(“设备。TYPE", (response) => {if (response。年代tatus == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
cmbSDK包含一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置,而在内置摄像头的情况下,这些是在附录B,其中将不启用任何符号。该方法如下:
readerDevice.ResetConfigWithCompletion((error) => {if (error != null){//重置配置失败,可能原因是:读取器断开,电池没电或线缆未插}});
有了正确配置的阅读器,您就可以扫描条形码了。方法即可完成这一任务StartScanning ()方法中的CMBReaderDevice对象。接下来会发生什么取决于的类型CMBReaderDevice以及它是如何配置的。一般来说:
在下列情况之一时停止扫描:
当条形码成功解码时,您将收到一个CMBReadResults数组中的CMBReaderDevice的使用以下方式进行委托ICMBReaderDeviceDelegate方法:
DidReceiveReadResultFromReader(CMBReaderDevice reader, CMBReadResults readResults)
只需显示ReadResult扫描条形码后:
public void DidReceiveReadResultFromReader(CMBReaderDevice reader, CMBReadResults readResults) {if (readResults. readResults. readresult . readresult . readresult . readresult . readresult . readresult . readresult . readresult . readresult .长度> 0){CMBReadResult readResult = (CMBReadResult)readResults.ReadResults[0];如果(readResult。图像!= null) { ivPreview.Image = readResult.Image; } if (readResult.ReadString != null) { lblCode.Text = readResult.ReadString; } } }
在上面的例子中,ivPreview是一个UIImageView,用于显示被扫描的条形码的图像,和lblCode是一个UILabel,用于显示来自条形码的结果。你也可以使用bool fromreadResult。GoodRead查询扫描是否成功。
当条形码被成功读取时,一个CMBReadResult对象创建并返回DidReceiveReadResultFromReader方法。在单个图像/帧上成功读取多个条形码的情况下,多个CMBReadResult返回对象。这就是为什么CMBReadResults类的数组CMBReadResult包含所有结果的对象。
的CMBReadResult类具有描述条形码读取结果的属性:
当扫描结束而没有成功读取时,将触发CMBReadResult返回的值与GoodRead属性设置为false。这通常发生在扫描被取消或超时时。
启用映像和ImageGraphics中填充的属性CMBReadResult对象,您必须设置相应的ImageResultEnabled和/或SVGResultEnabled的属性CMBReaderDevice对象.
要查看如何使用和并行显示图像和SVG图形的示例,请参考SDK包中提供的示例应用程序。
要从扫描的条形码访问原始字节,可以使用XML属性。字节以Base64字符串的形式存储在"full_string"标记下。
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时,CMBReadResults不会在相应的属性中包含任何数据。
要启用图像结果,使用以下方法从CMBReaderDevice类中设置ImageResultEnabled属性:
readerDevice。图像ResultEnabled = false;
要启用SVG结果,请使用以下方法从CMBReaderDevice类中设置imageResultEnabled属性:
readerDevice。年代VGResultEnabled = false;
在某些情况下,设备可能会因为电池电量不足或手动断开电缆而断开。这些情况可以通过ConnectionStateDidChangeOfReader的回调ICMBReaderDeviceDelegate.
从不活动状态返回到应用程序后,阅读器设备保持初始化但未连接。不需要重新初始化SDK,但需要重新连接。
一些iOS版本会在恢复应用程序时发送“可用性”通知,说明外部附件可用。你可以在ICMBReaderDeviceDelegate方法:CMBReaderDevice读取器w当阅读器可用时,您可以进行连接。
例如:
public void AvailabilityDidChangeOfReader(CMBReaderDevice reader) {if (readerDevice. readerDevice)可用性== cmbreaderavailability。Available) { readerDevice.ConnectWithCompletion((error) => { if (error != null) { // handle connection error } }); } }
一些iOS版本不会在简历中报告可用性变化,所以你需要手动处理。添加一个观察者UIApplicationDidBecomeActiveNotification和连接。
例子:
公共覆盖无效ViewDidLoad() {base.ViewDidLoad();UIApplication NSNotificationCenter.DefaultCenter.AddObserver(。DidBecomeActiveNotification AppBecameActive);} void AppBecameActive(NSNotification obj) {if (readerDevice != null && readerDevice.}可用性== cmbreaderavailability。可用的&& reader设备。ConnectionState!= CMBConnectionState.Connecting && readerDevice.ConnectionState != CMBConnectionState.Connected) { readerDevice.ConnectWithCompletion((error) => { if (error != null) { // handle connection error } }); } }
打开Visual Studio并遵循以下步骤:
1.去File ->新建->项目。
2.创建手机应用程序(Xamarin.Forms),设置项目名称,从模板中选择空白并选择安卓而且iOS平台。
接下来右键单击Android平台特定的项目文件,然后单击属性,进入Android Manifest部分。
设置你的Manifest文件(应用程序名称,应用程序图标,最小和最大android版本),确保启用相机的许可.
对于iOS平台的特定项目,我们也应该这么做。打开你的Info.plist根据您的需要(应用程序名称、部署目标等)将一些项目属性归档并设置。
一定要添加相机的许可。在Visual Studio中,没有从这里添加这个权限的选项。你需要打开你的Info.plist在文本编辑器中添加以下行:
NSCameraUsageDescription 用于扫描的摄像头
如果你使用MX设备作为阅读器,在Info.plist中添加以下协议:
UISupportedExternalAccessoryProtocols com.cognex. cognex. >Dmcc com.demo.data . Dmcc com.demo.data
在app Store上传你的应用之前,请检查这部分内容:让你的MX移动终端应用程序进入应用商店
我们发布了我们的SDK作为nuget包https://www.nuget.org.请安装Cognex.cmbSDK.XamarinForms这个解决方案中的Nuget包。安装包时选择所有三个项目。
注意:如果到目前为止您使用的是本地XamarinDataManLibrary.dll,而现在您想要更新SDK,请首先删除平台特定项目中对XamarinDataManLibrary.dll的引用,然后安装nuget包。另外,如果你在scannercontroller .cs类中没有任何自定义代码,你可以从所有三个项目中删除它们,因为这个视图渲染器现在也包含在nuget包中。
如果你计划在iOS低于12.2的设备上使用你的应用程序,就需要额外的步骤:
注意:此包仅适用于真实设备。你不能在iOS版本低于12.2的模拟器上测试你的应用程序。
要在没有MX移动终端的移动设备上使用cmbSDK进行条形码扫描,您需要安装许可密钥。如果许可证密钥丢失,将显示星号而不是扫描结果。
有关如何获取许可证密钥(包括30天试用许可证)的信息,请与您的康耐视销售代表联系。
如果你获得跨平台许可(两个平台的一个许可),当你创建相机扫描仪时,直接从代码实现激活:
如果(param_deviceClass = = ScannerDevice.PhoneCamera ) { //*************************************************************************************** // 创建一个照相扫描器(内置摄像头或一个mx - 100) / / / /注意:如果我们是连接到一个mx - 100 (cameraMode = = ScannerCameraMode.ActiveAimer) / /不需要许可证密钥。但是,如果我们使用手机或平板电脑的内置摄像头//进行扫描,那么SDK需要许可证密钥。参考// SDK关于获取许可密钥的文档以及//向SDK传递密钥的方法(在本例中,我们依赖于// plist.info和androidmanifest.xml中的条目——也有DeviceCamera方法,它可以作为参数传递//)。//*************************************************************************************** scannerControl。GetPhoneCameraDevice (param_cameraMode ScannerPreviewOption。默认值,true, "SDK_KEY");}
否则,如果你有不同的键(键只适用于iOS和Android),将这些键添加到AndroidManifest.xml或Info中。plist文件。
对于Android,在应用程序的AndroidManifest.xml文件的application标签下添加以下行:
<应用>…
对于iOS,将其作为一个键添加到项目特定的信息中。plist文件:
MX_MOBILE_LICENSE 您的许可密钥
//当MX-1xxx设备变得可用(USB线被插入,或MX设备被打开)时调用,//或当以前可用的MX-1xxx变得不可用(USB线被拔出,由于不活动或电池耗尽而关闭)公共void OnAvailabilityChanged(对象发送方,ScannerAvailability可用性){ClearResult();if (availability == ScannerAvailability.Available) {ConnectToScannerDevice();} else if (availability == ScannerAvailability.Unavailable) {DisplayAlert("Device was unavailable", null, "OK");}} //连接方法已经完成,在这里你可以看到是否有建立连接的错误// (args:{//如果我们有有效的连接错误param将为空,//否则这里是错误,通知我们的问题,我们有连接到扫描仪如果((ScannerExceptions)args[0] != ScannerExceptions. noexception){//要求相机权限,如果必要(仅android,对于iOS,我们从SDK处理权限)if ((ScannerExceptions)args[0] == ScannerExceptions. camerapermissionexception) RequestCameraPermission();else {Debug.WriteLine(args[1].ToString());UpdateUIByConnectionState (ScannerConnectionStatus.Disconnected);}}} //当与扫描程序的连接被更改时调用。//扫描器仅在"Connected"状态下可用。OnConnectionStateChanged(对象发送者,ScannerConnectionStatus状态){ClearResult(); if (status == ScannerConnectionStatus.Connected) { // We just connected, so now configure the device how we want it ConfigureScannerDevice(); } isScanning = false; UpdateUIByConnectionState(status); } // This is called after scanning has completed, either by detecting a barcode, canceling the scan by using the on-screen button or a hardware trigger button, or if the scanning timed-out public void OnReadResultReceived(object sender, List results) { ClearResult(); foreach (ScannedResult item in results) scanResults.Add(item); isScanning = false; btnScan.Text = "START SCANNING"; }
创建扫描设备
使用以下工厂方法初始化MX阅读器的扫描设备对象:
//*************************************************************************************** // 创建一个MX-1xxx扫描仪(注意,没有许可证密钥 ) //*************************************************************************************** scannerControl.GetMXDevice ();
MX移动终端的可用性可以在设备打开或关闭、USB线连接或断开时发生变化。可以使用下面的方法处理这些更改AvailabilityChanged事件处理程序:
OnAvailabilityChanged(ScannerAvailability args)
建议使用MX移动终端扫描条码。但是,cmbSDK还支持使用移动设备的内置摄像头。这包括可选的外部瞄准镜或照明的支持,以及直播预览的外观定制。
当使用移动设备内置摄像头扫描条码时,需要初始化扫描设备对象使用scannerControl。GetPhoneCameraDevice方法。摄像机阅读器在初始化时有几个选项。需要设置以下参数:
的ScannerCameraMode参数的类型为ScannerCameraMode枚举,它接受下表中列出的值之一。
这些模式为扫描器提供了以下默认设置:
根据选择的模式,设置额外的照明选项和行为,也列在表中。
价值 | 描述 | 照明 | 直播预览 |
---|---|---|---|
NoAimer | 初始化阅读器以使用移动设备屏幕上的实时流预览,以便用户可以将条形码定位在摄像机的视场内进行检测和解码。如果移动设备没有瞄准附件,请使用此模式。 | 照明是可用的,一个按钮控制它是可见的实时流预览。 | 显示 |
如果命令被发送到阅读器用于瞄准器控制,则它们将被忽略。 | |||
PassiveAimer | 初始化阅读器以使用被动瞄准器。在这种模式下,设备屏幕上没有实时流预览,因为瞄准模式是投影的。 | 照明不可用,直播预览没有照明按钮。 | 不显示 |
如果向阅读器发送用于照明控制的命令,则会忽略它们,因为在这种模式下,假定移动设备的内置LED用于瞄准器。 | |||
ActiveAimer (仅适用于iOS) |
将不会显示直播预览StartScanning ()方法默认调用。 | 照明是可用的,如果摄像头预览选项是启用的,照明控制按钮也是可用的。 | 不显示 |
接受照明或瞄准器控制命令。 | |||
FrontCamera | 初始化阅读器以使用移动设备的前置摄像头(如果可用)。使用这个配置要小心,因为大多数前置相机没有自动对焦和照明,提供的图像分辨率明显较低。在此模式下照明不可用。 | 前置摄像头。 | 显示 |
照明是不可用的,直播预览没有照明按钮。 | |||
如果命令被发送到阅读器用于瞄准器或照明控制,它们将被忽略。 |
扫描仪PreviewOption参数的类型为ScannerPreviewOption枚举,用于更改阅读器的默认值或覆盖从所选Scanner派生的默认值CameraMode.您可以指定以下选项:
价值 | 描述 |
---|---|
违约 | 接受CameraMode设置的所有默认值。 |
NoZoomButton | 隐藏直播预览中的缩放按钮,防止用户调整移动设备相机的缩放。 |
NoIlluminationButton | 隐藏实时流预览上的照明按钮,防止用户切换照明。 |
HardwareTrigger | 启用模拟硬件触发器(音量下降按钮),以便在移动设备上开始扫描。这个按钮只在按下时开始扫描,不需要像专用扫描仪的触发器那样按住,第二次按下它也不会停止扫描过程。 |
停顿了一下 | 如果使用直播预览,则在startScanning ()方法调用,但是直到用户按下屏幕上的按钮启动扫描过程,阅读器才开始解码。 |
AlwaysShow | 强制显示实时流预览,即使选择了瞄准模式(例如CameraMode == PASSIVE_AIMER)。 |
PessimisticCaching | 使用更高分辨率的设备摄像头,支持的设备默认分辨率为1280x720,不支持的设备默认分辨率为1920x1080。这有助于扫描小的条形码,但增加了解码时间,因为每帧有更多的数据要处理。 |
HighResolution (仅适用于iOS) |
使用高分辨率的设备摄像头,以帮助扫描小条码,但解码时间慢。在支持该选项的设备上,该选项将分辨率设置为1920x1080,在不支持该选项的设备上设置为默认分辨率。默认分辨率为1280x720。 |
HighFrameRate | 使用设备的相机在60帧,而不是默认的30帧,以提供一个更流畅的相机预览。 |
ShowCloseButton | 在局部视图中显示关闭按钮。 |
KeepPreviewInPausedState | 读取或超时后将预览保持在暂停状态。 |
如果全屏参数已设置真正的,则使用全屏预览,否则使用部分屏幕预览。
的RegistrationKey(可选)参数用于使用您拥有的许可密钥对您的SDK进行许可
例子:
创建一个没有瞄准器和全屏直播预览的阅读器:
scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,真实);
创建一个没有瞄准器,没有缩放按钮,并使用模拟触发器的阅读器:
scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。NoZoomButton|ScannerPreviewOption.HardwareTrigger,真正的);
从Android 6.0及以上版本,您需要向用户请求访问移动设备的内置摄像头的权限。
如果由于权限问题而无法打开相机,则OnConnectionCompleted(发送者,args)回调函数包含ScannerException在参数args中。您可以检查此异常类型并请求权限。
公共空间OnConnectionCompleted(对象发送方,object [] args){/ /如果我们有有效的连接错误参数将null, / /否则这是错误,告知我们的问题,我们有同时连接扫描仪,如果((ScannerExceptions) args [0] ! = ScannerExceptions.NoException){/ /要求相机允许在必要时(android, iOS我们处理许可SDK)如果(args (ScannerExceptions) [0] = = ScannerExceptions.CameraPermissionException) RequestCameraPermission ();...
如果相机权限被授予,您可以尝试再次连接到扫描仪设备:
private async void RequestCameraPermission() {var result = await Permissions.RequestAsync();//检查权限请求的结果。如果用户允许,连接到扫描仪If (result == PermissionStatus.Granted) {scannerControl.Connect();} else {if (Permissions.ShouldShowRationale()) {if (await DisplayAlert(null, "你需要允许访问相机","OK", "Cancel")) RequestCameraPermission();}}}
连接前,请设置OnAvailabilityChanged,ConnectionStateChanged而且ConnectionCompleted事件处理程序。
OnConnectionStateChanged(对象发送者,ScannerAvailability状态)public void OnConnectionCompleted(对象发送者,对象[]args)
方法初始化后调用connect方法ScannerDevice.
//在可以配置或使用扫描仪之前,需要建立一个连接私有void ConnectToScannerDevice() {scannerControl.Connect();}
我们之前设置的事件处理程序将用new调用ScannerDevice状态信息。
MX系列移动终端提供复杂的设备配置和管理,包括保存在设备上的配置。MX设备配备了Cognex预配置的大多数符号和功能,可以随时使用。
如果需要自定义配置,可以通过DataMan安装工具或Cognex快速安装重新配置。这两个工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序可以配置MX设备,为您提供以下选项:
cmbSDK使用一组默认选项,通过移动设备的内置摄像头来读取条形码。然而,有两个重要的区别需要记住:
MX-100是iphone专用的设备外壳附件,为内置摄像头提供额外功能,如瞄准功能和更好的照明控制。MX-100是MX设备和内置扫描仪的混合,它具有存储在设备上的瞄准器强度、照明强度和瞄准器调制的设置,而其他设置(如符号设置)则存储在cmbSDK中。看到MX-100用户指南更多信息。
以下是使用MX-100设备时需要记住的几点:
CmbSDK不启用任何功能象征学默认使用移动设备内置摄像头读取条码。您必须启用应用程序需要扫描的所有条形码符号,以实现最佳的扫描性能。
控件的以下方法可以启用各个符号ScannerControl类:
setsymbolologyenabled (symbolology, bool enable)
此方法中用于符号学参数的所有符号学都可以在符号学枚举。
例子
//显式地启用我们需要的符号。Datamatrix,真正的);scannerControl.SetSymbologyEnabled(象征。C128,真正的);
你也可以使用相同的方法禁用符号:
//显式禁用我们知道不需要的符号Codabar、假);
你可以实现symbolologyenabled事件处理程序来检查符号更改的结果:
// symbolologyenabled listener (args: symbolology symbolology, bool isEnabled, string error) public void onsymbolologyenabled (object sender, object[] args) {if ((string)args[2] != null)调试。WriteLine("Failed to enable/disable " + args[0].ToString());else Debug.WriteLine(((symbol)args[0]).ToString() + ((bool)args[1] ?" Enabled ": " disabled"));}
如果您的扫描仪设备配有照明灯,您可以使用以下DMCC控制它们:
scannerControl。年代endCommand("SET LIGHT.INTERNAL-ENABLE ON");
你可以在扫描预览处于活动状态时控制灯光,或者如果你在启动扫描仪之前发送这个DMCC,你将设置灯光的初始值。
当使用移动设备的内置摄像头作为阅读器时,您可以配置缩放级别及其使用方式。有三种缩放级别:
的设置相机。缩放百分比[100-max] [100-max]命令用于配置两个级别放大的百分比。100不放大,MAX(最高可达1000)放大到设备所能达到的程度。第一个参数用于设置级别1的缩放,第二个用于级别2的缩放。
控件可以检查当前缩放设置让相机。ZOOM-PERCENT命令,该命令返回两个值:第1级和第2级缩放。
例子
scannerControl。年代endCommand("SET CAMERA.ZOOM-PERCENT 250 500");
获取/设置相机。变焦0 - 2是另一个设置缩放级别或返回实际设置的命令。SET命令可能的值有:
您可以在扫描之前或甚至在扫描期间调用此命令,缩放将上升到配置的级别。如果扫描完成,则该值重置为正常行为(0)。
例子
scannerControl。年代endCommand("SET CAMERA.ZOOM 2");
当使用移动设备的相机时,cmbSDK允许您在预览容器中或全屏查看相机预览。这个预览还包含一个可定制的覆盖。cmbSDK相机覆盖功能按钮缩放,闪烁和关闭扫描仪,和一个进度条显示扫描超时。
使用cmbSDK v2.0中最初使用的遗留相机覆盖。x和ManateeWorks SDK,在初始化ScannerDevice之前使用这个:
private void CreateScannerDevice() {if (param_deviceClass == ScannerDevice.PhoneCamera) {scannerControl.SetOverlay(ScannerOverlay.LEGACY);scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,真实);}
当使用cmbSDK覆盖时:
cmbSDK和遗留覆盖都允许您更改用于缩放和闪光按钮的图像,如果您的图像具有与cmbSDK使用的名称相同的名称。您可以在参考资料/中找到cmbSDK中使用的图像和名称必威随行版官网drawable-mdpi而且drawable-hdpi目录的Android和资源/必威随行版官网MWBScannerImages.xcassetsiOS。
cmbSDK和遗留覆盖都允许您更改检测到条形码时显示的矩形的颜色和宽度。这些更改需要在ConfigureScannerDevice()方法中完成(在我们与扫描设备建立有效连接之后)。
例子:
私有void ConfigureScannerDevice() {scannerControl。System.Drawing.Color SetLegacyOverlayLocationLine(255。黄色,6.0f,真);...
Cognex扫描设备通过DMCC (DataMan Control Commands)对设备进行配置和控制。该设备的每一个功能都可以使用这种基于文本的语言来控制。API提供了向设备发送DMC命令的方法。存在用于设置和查询配置属性的命令。DMC命令适用于所有平台和框架。
的附录包括完整的DMCC参考相机阅读器。
下面的示例展示了发送到设备进行更高级配置的不同DMCC。
例子
//修改扫描方向为omnidirectional scannerControl。SendCommand("SET DECODER.1D-SYMBOLORIENTATION 0");//修改直播预览的扫描超时时间为10秒scannerControl。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10”);
你也可以设置responserreceived事件处理程序来接收来自send命令的响应:
//发送DMCC命令(args: string payload, string error, string DMCC) public void onresponserecved (object sender, object[] args) {if ((string)args[1] != null)调试。WriteLine(“执行DMCC失败”);其他调试。WriteLine("Response for " +(字符串)args[2] + ": " +(字符串)args[0]);}
CmbSDK包括一个将设备重置为默认设置的方法。对于MX移动终端,默认配置为已保存的配置。对于内置相机,默认设置为附录,其中没有启用任何符号。
要重置设备,发送这个DMCC:
scannerControl.SendCommand(“CONFIG.DEFAULT”);
在使用MX移动终端时,我们可以区分三种状态:
有了正确配置的阅读器,您就可以扫描条形码了。方法即可完成这一任务StartScanning ()方法中的scannerControl.接下来会发生什么取决于的类型ScannerDevice以及它是如何配置的。一般来说:
在下列情况之一时停止扫描:
当条形码被成功解码时,您将在ReadResultReceived中收到ScannedResult列表事件:
//在扫描完成后调用,要么检测到条形码,要么使用屏幕上的按钮或硬件触发按钮取消扫描,要么扫描超时公共void OnReadResultReceived(对象发送者,List results)
只需显示ScannedResult扫描条形码后:
OnReadResultReceived(对象发送者,列表结果){if(结果。计数> 0){ScannedResult readResult =结果[0];lblCode。文本= readResult.ResultCode;}}
在某些情况下,设备可能会因为电池电量不足或手动断开电缆而断开。这些病例可以在ConnectionStateChanged事件处理程序。
从不活动状态返回到应用程序后,阅读器设备保持初始化但未连接。不需要重新初始化SDK,但需要重新连接。对于iOS,我们正在做的是在ScannerControl渲染器,而对于Android需要手动完成时,页面恢复:
//当页面消失时,需要//关闭与扫描设备的连接;因此,当我们被恢复(再次出现此页面)时,我们//必须恢复连接(假设我们有一个)。//这只用于android。/ /创建我们使用iOS观察者的ScannerControl类在iOS平台特定的项目 //---------------------------------------------------------------------------- 如果设备。RuntimePlatform ==设备。安卓&& await Permissions.CheckStatusAsync() == PermissionStatus.Granted) { ConnectToScannerDevice(); }