わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

CBCharacteristics/CBMutableCharacteristic クラスリファレンス 日本語訳

これはCBCharacteristicsクラスのうちCoreBlutoothを理解するために必要最小限の部分を日本語訳したものです。

CBCharacteristicsクラス

プロパティ

@property(readonly, nonatomic) CBService *service;

このcharacteristicが属するサービスへのポインタです。

@property(readonly, nonatomic) CBUUID *UUID;

characteristicのBluetooth UUID。

@property(readonly, nonatomic) CBCharacteristicProperties properties;

characteristicのプロパテイです。

@property(retain, readonly) NSData *value;

characteristicsの値です。

@property(retain, readonly) NSArray *descriptors;

このcharacteristicで、これまでに発見されたCBDescriptorsのリストです。

@property(readonly) BOOL isBroadcasted;

このcharacteristcが現在ブロードキャストされているか、否かを示します。

@property(readonly) BOOL isNotifying;

このcharacteristicが現在ノーティフィケーションされているか否かを示します。

CBMutableCharacteristics クラス

iOS6から有効です。
CBMutableCharacteristicsクラスは、CBCharacteristicクラスを継承します。

プロパティ

@property(assign, readwrite, nonatomic) CBAttributePermissions permissions;

characteristic valueの許可設定です。

see CBAttributePermissions

@property(retain, readwrite, nonatomic) CBUUID *UUID;

@property(assign, readwrite, nonatomic) CBCharacteristicProperties properties;

@property(retain, readwrite) NSData *value;

@property(retain, readwrite) NSArray *descriptors;

インスタンスメソッド

- (id)initWithType:(CBUUID )UUID properties:(CBCharacteristicProperties)properties value:(NSData )value permissions:(CBAttributePermissions)permissions;

返り値は、初期化されたcharacteristicです。

  • UUID
    • characteristicのBluetooth UUIDです。
  • properties
    • characteristicのプロパティです。
  • value
    • キャッシュされるcharacteristicの値です。もしもnilならば、値はダイナミックであり、オンデマンドで要求されます。
  • permissions
    • charactersticの値のパーミションです。

列挙型

CBAttributePermissions

ATT attributeの読み出し/書き込み/暗号化許可属性です。論理和で結合できます。

  • CBAttributePermissionsReadable
    • 読み出しのみ
  • CBAttributePermissionsWriteable
    • 書き込みのみ
  • CBAttributePermissionsReadEncryptionRequired
    • 信頼されたデバイスが、読み出し可能
  • CBAttributePermissionsWriteEncryptionRequired
    • 信頼されたデバイスが、書き込み可能

CBCharacteristicProperties

CBCharacteristicPropertiesは、そのcharacteristicの値がどのように使えるか、またはdescriptor(s)がアクセスできるかを示します。
論理和で結合させることができます。
特に明記がない限り、
CBPeripheralManager で公開されたローカルのcharacteristicsに対してプロパティは有効です。

  • CBCharacteristicPropertyBroadcast
    • characteristic configuration descriptorを使って、characteristicの値をブロードキャすることを許します。
    • local characteristcには許されていません。
  • CBCharacteristicPropertyRead
    • characteristicの値を読むことを許します。
  • CBCharacteristicPropertyWriteWithoutResponse
    • characteristicの値への、レスポンスがない書き込みを許可します。
  • CBCharacteristicPropertyWrite
    • characteristicの値への、書き込みを許可します。
  • CBCharacteristicPropertyNotify
    • characteristicの値の、レスポンスがないノーティフィケーションを許可します。
  • CBCharacteristicPropertyIndicate
    • characteristicの値の、インディケーションを許可します。
  • CBCharacteristicPropertyAuthenticatedSignedWrites
    • characteristicの値への、承認ありの書き込みを許可します。
  • CBCharacteristicPropertyExtendedProperties
    • もしも設定されていれば、追加のcharacteristicプロパティが、characteristic extended properties descriptorに定義されています。
    • local characteristicsには許されていません。
  • CBCharacteristicPropertyNotifyEncryptionRequired
    • もしも設定されていれば、信頼されたデバイスのみがcharacteristicの値のノーティフィケーションを有効に出来ます。
  • CBCharacteristicPropertyIndicateEncryptionRequired
    • もしも設定されていれば、信頼されたデバイスのみがcharacteristicの値のインディケーションを有効に出来ます。

CBPeripheralDelegateプロトコル リファレンス 日本語訳

これはApple社のhttp://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.htmlのうち、CoreBluetoothを理解するために必要最小限の部分を日本語訳したものです。

CBPeripheralDelegateプロトコルは、CBPeripheralのdelegateプロパティが実装すべきプロトコルです。
CBPeripheralDelegateプロトコルの、すべてのメソッドはoptionalです。

インスタンス・メソッド

- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService )service error:(NSError *)error;

-[discoverCharacteristics:forService:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたcharacteriticsは、それがあったならば、サービスの”characteristics”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

Invoked upon completion of a request.

- (void)peripheral:(CBPeripheral )peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[discoverDescriptorsForCharacteristic:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたdescriptorsは、それがあったならば、キャラクタリスティックの”descriptors”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

Invoked upon completion of a -[discoverIncludedServices:forService:] request.

- (void)peripheral:(CBPeripheral )peripheral didDiscoverIncludedServicesForService:(CBService )service error:(NSError *)error;

-[discoverIncludedServices:forService:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたservicesは、それがあったならば、サービスの”includedServices”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error;

-[discoverServices:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、発見されたservicesは、それがあったならば、ペリフェラルの”services”プロパティにマージされています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[setNotifyValue:forCharacteristic:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

(訳者注:ここから先の説明があまりに素っ気いないのですが、原文そのままです。あまりにそっけないので、あとで解説を追加します。)

- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[readValueForCharacteristic:] リクエストが完了した、もしくはnotification/indicationを受信した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForDescriptor:(CBDescriptor )descriptor error:(NSError *)error;

-[readValueForDescriptor:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didWriteValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

-[writeValue:forCharacteristic:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheral:(CBPeripheral )peripheral didWriteValueForDescriptor:(CBDescriptor )descriptor error:(NSError *)error;

-[writeValue:forDescriptor:] リクエストが完了した時に、呼ばれます。

もしも成功しなかったら、”error”には、発生した失敗が設定されます。

- (void)peripheralDidUpdateRSSI:(CBPeripheral )peripheral error:(NSError )error;

-[readRSSI:] リクエストが完了した時に、呼ばれます。

もしも成功したら、”error”はnilで、ペリフェラルの”RSSI”プロパティは更新されています。もしも成功しなかったら、”error”には、発生した失敗が設定されます。

CBPeripheralクラスリファレンス 日本語訳

プロパティ

@property(assign, nonatomic) id delegate;

ペリフェラルのイベントを受信するデリゲートです。

@property(readonly, nonatomic) CFUUIDRef UUID;

ペリフェラルが、少なくとも一度システムから接続されたことがあれば、ペリフェラルにはUUIDが割り当てられます。(訳者注:逆にこれまで一度も接続したことがないペリフェラルでは、nilになります。接続は、他のアプリでの接続、iPhoneの電源オン/オフ、再起動に関係なく、一度でも接続したことがあるペリフェラルであれば、UUIDが割り当てらています。)

ペリフェラルを取得するために、後に
BCentralManager
に与えるために、このUUIDを保存しておけます。

@property(retain, readonly) NSString *name;

ペリフェラルの名前です。(訳者注:アドバタイズメント・データのローカル名を示します。通常は型番が与えらています。)

@property(retain, readonly) NSNumber *RSSI;

接続している間、接続のRSSIをデシベルで表します。

(訳者注:RSSIは、Received Signal Strength Indicatorの略称で、受信信号強度を表します。このRSSIは、RF送受信の半導体が出力する信号値をそのまま使っていると推測されます。物理的に絶対値が正しい値とは限りませんが、目安としては利用できるでしょう。信号レベルは対数で、デシベル(10log 信号電力)で表します。通常、-40 ~ -90dB程度の範囲です。マイナスになるほど、信号が弱いことを示します。)

@property(readonly) BOOL isConnected;

ペリフェラルが現在接続しているかを、示します。

@property(retain, readonly) NSArray *services;

ペリフェラルで発見されたサービスの、CBServiceオブジェクトのリストです。

メソッド

- (void)readRSSI;

接続の現在のRSSIを取得します。

see peripheralDidUpdateRSSI:error:

- (void)discoverServices:(NSArray *)serviceUUIDs;

ペリフェラルで有効なサービスを発見します。

  • serviceUUIDs
    • 発見すべきサービスのUUIDを表す、CBUUIDオブジェクトのリストです。もしもnilを与えると、ペリフェラルのすべてのサービスが発見されるでしょうが、とても遅くなり、従って推奨しません。

see peripheral:didDiscoverServices:

- (void)discoverIncludedServices:(NSArray )includedServiceUUIDs forService:(CBService )service;

指定したサービスのincluded serviceを発見します。
(訳者注: Bluetooth low energyのサービスは、オブジェクト指向でいうクラスの概念に相当します。いまあるサービスはそのまま提供しつつ、そのサービスの機能を拡張する仕組みが、included serviceで、ちょうどクラス継承の概念に相当します。)

  • includedServiceUUIDs
    • 発見すべきincluded serviceのUUIDを表すCBUUIDオブジェクトのリストです。もしもnilならば、サービスのすべてのincluded serviceが発見されますが、とても遅くなり、従って推奨しません。
  • service
    • プライマリGATTサービス

see peripheral:didDiscoverIncludedServicesForService:error:

- (void)discoverCharacteristics:(NSArray )characteristicUUIDs forService:(CBService )service;

サービスの指定したcharacteristicを発見します。

  • charactertisticsUUIDs
    • 発見すべきcharacteristicのUUIDを表すCBUUIDオブジェクトのリストです。もしnilならば、サービスのすべてのcharacteristicsが発見されますが、とても遅くなり、従って推奨しません。
  • service
    • GATTサービス

see peripheral:didDiscoverCharacteristicsForService:error:

- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;

characteriticの値を読みます。

  • characteristic
    • GATT characteristic

see peripheral:didUpdateValueForCharacteristic:error:

- (void)writeValue:(NSData )data forCharacteristic:(CBCharacteristic )characteristic type:(CBCharacteristicWriteType)type;

characteristicの値として、valueを書き込みます。

  • data
    • 書き込む値
  • characteristic
    • 書き込み対象のcharacteristic
  • type
    • 書き込みタイプ。characteristicへの書き込み完了を報告する/しないが設定できる。

see peripheral:didWriteValueForCharacteristic:error:

see CBCharacteristicWriteType

- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;

characteristicの値の、notification/indicationの有効/無効を背呈します。

characterisitcが、notification/indicationの両方を許可しているならば、notificationが使われます。
notification/indicationが有効になったとき、characteristicの値更新は、デリゲート
peripheral:didUpdateValueForCharacteristic:error:
に通知されます

更新を送るのは、選択したペリフェラルが行うものなので、
notification/indicationが有効である間、アプリケーションはその変更を処理できるように備えるべきです。

(訳者注:Bluetooth low energyは、接続先の装置の値更新をiPhone側にプッシュする仕組みがあります。それがnotificationとindicationです。この2つの違いは、通知の信頼性です。

  • notification
    • 接続先の装置からiPhoneに、値の更新を通知します。
    • notificationは通知だけの、信頼性のない通知です。iPhoneが接続先の装置に、値更新通知を受信したことを返しません。
  • indication
    • notificationと同じく、接続先の装置からiPhoneに、値の更新を通知します。
    • indicationは、iPhoneが接続先装置に値更新を受信したことを返信する、信頼性が確保された通知方法です。

例えば、室温やバッテリー残量のように、センサーなどの値変化を通知するが、一定周期で送信するため、通知データを取りこぼしても問題がない場合は、notificationを用いるなどします。

notification/indicationのいずれを実装しているかは、装置のファームウェア設計によります。readできるcharacteristicが、notification/indicationを実装しているとは限りません。iPhone側は、configutaionをみて、そのcharacteristicがnotification/indicationに対応しているかをみることしかできません。)

  • enabled
    • notification/indication を有効にすべきか、否かを設定します
  • characteristic
    • クライアントcharacteristic configuration descriptorを保持しているcharacteristic

see peripheral:didUpdateNotificationStateForCharacteristic:error:

seealso CBConnectPeripheralOptionNotifyOnNotificationKey

- (void)discoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic;

characteristicのdescriptor(s)を発見します。

  • characteristic
    • GATT characteristic

see peripheral:didDiscoverDescriptorsForCharacteristic:error:

- (void)readValueForDescriptor:(CBDescriptor *)descriptor;

descriptorの値を読みます。

  • descriptor
    • GATT characteristic descriptor

see peripheral:didUpdateValueForDescriptor:error:

- (void)writeValue:(NSData )data forDescriptor:(CBDescriptor )descriptor;

descriptorの値としてvalueを書き込みます。Client characteristic configuration descriptorはこのメソッドで書き込みはできません。
それには、 setNotifyValue:forCharacteristic: を使うべきです。

see peripheral:didWriteValueForCharacteristic:error:

###

列挙型

CBCharacteristicWriteType

  • CBCharacteristicWriteWithResponse = 0,
  • CBCharacteristicWriteWithoutResponse,

CoreBluetoothフレームワーク 定数 日本語訳

これはApple社のドキュメント
http://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CoreBluetooth_Constants/
からCoreBluetoothフレームワークを理解するために必要最小限の部分のみを日本語訳したものです。

CBError.h

Bluetoth low energyのトランザクションで生じうるエラーです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
enum {
CBATTErrorInvalidHandle = 0x01,
CBATTErrorReadNotPermitted = 0x02,
CBATTErrorWriteNotPermitted = 0x03,
CBATTErrorInvalidPdu = 0x04,
CBATTErrorInsufficientAuthentication = 0x05,
CBATTErrorRequestNotSupported = 0x06,
CBATTErrorInvalidOffset = 0x07,
CBATTErrorInsufficientAuthorization = 0x08,
CBATTErrorPrepareQueueFull = 0x09,
CBATTErrorAttributeNotFound = 0x0A,
CBATTErrorAttributeNotLong = 0x0B,
CBATTErrorInsufficientEncryptionKeySize = 0x0C,
CBATTErrorInvalidAttributeValueLength = 0x0D,
CBATTErrorUnlikelyError = 0x0E,
CBATTErrorInsufficientEncryption = 0x0F,
CBATTErrorUnsupportedGroupType = 0x10,
CBATTErrorInsufficientResources = 0x11,
};

CBCEntralManagerDelegateProtocol リファレンス 日本語訳

これは、Apple社のCBCentralManagerクラスドキュメント http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBCentralManagerDelegate_Protocol/translated_content/CBCentralManagerDelegate.html
から、CoreBluetooth開発の理解に必要最低限の情報を日本語に意訳したものです。

CBCentralManagerDelegate プロトコルは、CBCentralのデリゲートのプロトコルです。

CBCentralManagerDelegateは、-[centralManagerDidUpdateState:] のみがrequiredです。その他は optional です。

インスタンス・メソッド

- (void)centralManagerDidUpdateState:(CBCentralManager *)central;

セントラル・マネージャのステートが更新された時に、呼ばれます。

引数:

  • central
    • ステートが変化したセントラルマネージャ。

議論:

詳細は “state” プロパティを参照してください。

- (void)centralManager:(CBCentralManager )central didConnectPeripheral:(CBPeripheral )peripheral;

ペリフェラルとの接続が確立したときに、呼ばれます。

<<<<<<< HEAD

- (void)centralManager:(CBCentralManager )central didDisconnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;

ペリフェラルとの既存の接続が切断した時に、呼ばれます。

=======
centralManager:didDisconnectPeripheral:error:
Invoked whenever an existing connection with the peripheral is torn down.

- (void)centralManager:(CBCentralManager )central didDisconnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;

ペリフェラルとの既存の接続が切断した時に、呼ばれます。

centralManager:didDiscoverPeripheral:advertisementData:RSSI:
Invoked when the central discovers a peripheral while scanning.

- (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary )advertisementData RSSI:(NSNumber )RSSI;

セントラルがスキャン中にペリフェラルを発見した時に、呼ばれます。

議論:

アドバタイズメント / スキャン・レスポンス・データは、”advertisementData”に収納され、CBAdvertisementData * キーを通して読み出すことができる。 (訳者注:BLEの規格ではアドバタイズメント・パケットには、デバイス名、デバイスが提供するサービスのUUID、メーカ独自の拡張データを収納することができます。最後の拡張データがiOSで読み取れるかは、未確認。)
この引数のperipheralは、このペリフェラルに対して、なにかのコマンドを実行する場合は、必ずリテインしなければならない。(訳者注:リテインしないと、ペリフェラルは開放されて、接続が切断します。)

centralManager:didFailToConnectPeripheral:error:
Invoked whenever the central manager fails to create a connection with the peripheral.

- (void)centralManager:(CBCentralManager )central didFailToConnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;

セントラル・マネージャがペリフェラルと接続を確立するのに失敗した時に、呼ばれます。

議論:

失敗した原因は”error”に格納されます。

centralManager:didRetrieveConnectedPeripherals:
Invoked when the central manager retrieves the list of peripherals currently connected to the system.

- (void)centralManager:(CBCentralManager )central didRetrieveConnectedPeripherals:(NSArray )peripherals;

セントラル・マネージャが、現在システムと接続しているペリフェラルの一覧を取得した時に、呼び出されます。

議論:

詳細は -[retrieveConnectedPeripherals] メソッドを参照してください。

centralManager:didRetrievePeripherals:
Invoked when the central manager retrieves the list of known peripherals.

- (void)centralManager:(CBCentralManager )central didRetrievePeripherals:(NSArray )peripherals;

セントラル・マネージャが、既知のペリフェラルの一覧を取得した時に、呼び出されます。

議論:

詳細は -[retrievePeripherals:] メソッドを参照してください。

See Also:

centralManager:didRetrievePeripheral:

定数(CBAdvertisementData.h)

CBAdvertisementData.h は -[centralManager:didDiscoverPeripheral:advertisementData:RSSI:] のadvertisementDataの辞書の鍵を定義しています。

CBAdvertisementDataServiceUUIDsKey;

CBServiceのUUIDを表す、1つもしくはそれ以上のCBUUIDのリスト。

const CBAdvertisementDataOverflowServiceUUIDsKey

iOS6以降
アドバタイズメントデータの”overflow”領域で見つけられたCBService UUIDを表す、1つもしくはそれ以上のCBUUIDのリスト。
この領域のUUIDは”ベストエフォート”であるため、常に正確とは限らない。

参照:

startAdvertising:

CBAdvertisementDataLocalNameKey

ペリフェラルのローカル名を表す、NSString。

CBAdvertisementDataTxPowerLevelKey

ペリフェラルの送信電力を表す、NSNumber。

CBAdvertisementDataManufacturerDataKey

ペリフェラルの製造者データを表す、NSDataオブジェクト。

CBAdvertisementDataServiceDataKey

サービス特有のアドバタイズメントデータを含む辞書。
その辞書の鍵は、CBService UUIDを表す、CBUUIDオブジェクト。値はNSDataオブジェクト。

CBCentralManagerクラスリファレンス、日本語訳

これは、Apple社のCBCentralManagerクラスドキュメント http://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CBCentralManager_Class/から、CoreBluetooth開発の理解に必要最低限の情報を日本語に意訳したものです。

プロパティ

@property(assign, nonatomic) id delegate;

セントラル・マネージャのイベントを受け取るデリゲートを設定します。

@property(readonly) CBCentralManagerState state;

セントラル・マネージャの状態を表します。セントラル・マネージャをインスタンスしたときは初期値CBCentralStateUnknownです。この値が変化した瞬間に、デリゲートのコールバック - (void)centralManagerDidUpdateState:(CBCentralManager *)central が呼ばれます。

CBCentralManagerState列挙型は、以下の値を取ります。

1
2
3
4
5
6
7
8
typedef NS_ENUM(NSInteger, CBCentralManagerState) {
CBCentralManagerStateUnknown = 0,
CBCentralManagerStateResetting,
CBCentralManagerStateUnsupported,
CBCentralManagerStateUnauthorized,
CBCentralManagerStatePoweredOff,
CBCentralManagerStatePoweredOn
};
  • CBCentralManagerStateUnknown = 0,
    • 初期値です。すぐに更新されます。
  • CBCentralManagerStateResetting,
    • システムサービスとの接続が一時的に失なわれました。すぐに更新されます。
  • CBCentralManagerStateUnsupported,
    • Bluetooth Low EnergyのCentral/Clientをサポートしていません。
  • CBCentralManagerStateUnauthorized,
    • このアプリケーションは、Bluetooth Low EnergyのCentral/Client使う認可がありません。
  • CBCentralManagerStatePoweredOff,
    • Bluetoothがオフになっています。
  • CBCentralManagerStatePoweredOn
    • Bluetoothがオンで、かつ、いま利用できます。

インスタンスメソッド

- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;

ペリフェラルへの、ペンディング状態もしくは接続している接続を、キャンセルします。

connectPeripheral:options:
Establish a connection to the peripheral.

- (void)connectPeripheral:(CBPeripheral )peripheral options:(NSDictionary )options;

ペリフェラルへの接続を確立します。引数optionsで接続のオプションを指定出来ます。
CBConnectPeripheralOptionNotifyOnIiscoonectionKey を参照してください。

このメソッドはタイムアウトをしません。ペンディングされた接続をキャンセルするには、cancelPeripheralConnections: を使います。

- (CBCentralManager *)initWithDelegate:(id)delegate queue:(dispatch_queue_t)queue;

指定したデリゲートとディスパッチキューで、セントラルマネージャを初期化します。

  • queue
    • イベントを処理するキューを指定します。nilならばメインキューがデフォルトでつかわれます。

- (void)retrieveConnectedPeripherals;

システムに今在接続しているペリフェラルの一覧を取得するようにセントラルに問い合わせます。
問い合わせ結果はデリゲートを通して通知されます。

- (void)retrievePeripherals:(NSArray *)peripheralUUIDs;

UUIDで指定したペリフェラルの一覧をセントラルに問い合わせます。

  • peripheralUUIDs
    • 取得するCBPeripheralの CFUUIDRef のリスト。

問い合わせ結果はデリゲートを通して通知されます。

- (void)scanForPeripheralsWithServices:(NSArray )serviceUUIDs options:(NSDictionary )options;

セントラルにペリフェラルのスキャンを要求します。

  • serviceUUIDs
    • アプリケーションが興味があるサービスの CBUUIDs の配列。
  • options
    • スキャンを指定するオプションを指定した辞書。 CBCentralManagerScanOptionAllowDuplicatesKey を参照。

ペリフェラルそれぞれを発見する都度、デリゲートのコールバックが呼ばれます。”serviceUUIDs”でCBUUIDの配列が指定されている場合は、セントラルはそのサービス、もしくはそれらのサービスをアドバタイズしているペリフェラルのみを返します(推奨)。
“seriviceUUIDs”がnilの場合は、発見したすべてのペリフェラルを返します(非推奨)。
セントラルが、すでに異なるパラメータでスキャンしている場合は、指定したパラメータがそれを置換します。

- (void)stopScan;

セントラルにペリフェラルのスキャンを停止するよう問い合わせます。

定数

CBCentralManagerScanOptionAllowDuplicatesKey

このキーにはNSNumber(Boolean)の値が対応します。値がYESのとき、
ペリフェラルのスキャンで、重複したデバイスをフィルタリングをしません。デフォルトでは、同じペリフェラルを複数回発見したときは、1回の発見イベントに集約します。このフィルタリングを無効にすると、バッテリーの稼働時間に不利な影響をもたらすかもしれませんから、必要なときにだけ利用します。

scanForPeripheralsWithServices:options: を参照してください。

CBConnectPeripheralOptionNotifyOnConnectionKey

iOS6から有効です。

このキーには、NSNumber(Boolean)の値が対応します。値は、アプリケーションがサスペンドしている時に、
あるペリフェラルとの接続が確立したならば、
それをシステムがアラート表示すべきことを示します。

この設定は、アプリケーションが
bluetooth-central バックグラウンド・モード
を指定していないために、アプリケーションが自分でアラート表示できないときに便利です。

あるペリフェラルに対して、2つ以上のアプリケーションがこの通知を要求していたならば、フォアグラウンドで最も最近に要求をしたアプリケーションが、通知を受け取ります。

CBConnectPeripheralOptionNotifyOnDisconnectionKey

このキーには、NSNumber(Boolean)の値が対応します。この値は、アプリがサスペンドしている時に、
あるペリフェラルが切断したならば、それをシステムがアラート表示すべきことを示します。

この設定は、アプリケーションが
bluetooth-central バックグラウンド・モード
を指定していないために、アプリケーションが自分でアラート表示できないときに便利です。

あるペリフェラルに対して、2つ以上のアプリケーションがこの通知を要求していたならば、フォアグラウンドで最も最近に要求をしたアプリケーションが、通知を受け取ります。

CBConnectPeripheralOptionNotifyOnNotificationKey

このキーには、NSNumber(Boolean)の値が対応します。この値は、アプリがサスペンドしている時に、
あるペリフェラルから受信したすべてののティフィケーション(ここでのノティフィケーションは、iOSのそれではなく、Bluetooth Low Energyの規格でいうノティフィケーションを示す)に対して、
それをシステムがアラート表示すべきことを示します。

この設定は、アプリケーションが
bluetooth-central バックグラウンド・モード
を指定していないために、アプリケーションが自分でアラート表示できないときに便利です。

あるペリフェラルに対して、2つ以上のアプリケーションがこの通知を要求していたならば、フォアグラウンドで最も最近に要求をしたアプリケーションが、通知を受け取ります。

Macbook Airにお茶をこぼす前にできること

Macbook Airにお茶をこぼす前に、できることがあるのではと思ったので、写真をとってみた。

まず危険な状態。
手を前後に動かす、その動線上にお湯のみがあり、さらに、お湯のみが机の端に近いので、お湯のみを床に落として割る可能性も高い。

危険な状態:

  • お湯のみのお茶をMacbook Airにこぼす
  • お湯のみを床に落として割る

原因:

  • お湯のみが机の上に置いてある
  • 手の動線上にお湯のみがある

そもそも、開発しながらお茶を飲まない、お湯のみを机に置かない、という根本的な原因の取り除きもあるけれども、それは行き過ぎると、極端な話、死ぬ可能性があるから生きるのをやめる、になるので、ここではそこまでは問わない。

左上にお湯のみを移動した。動線にひっかからないので、トラブルは解消できそうだが、右利きなので、左にあるお湯のみまで手を伸ばすのが不便だ。

右上にお湯のみを移動した。動線は、あまり、ひっかからないだろう。左に置くよりもちょっと危険だが、お湯のみに手を伸ばすのは便利がいい。お湯のみの位置は、こうすることにした。

UTF-8なURLを書くとOctpressのページ生成で例外が発生する

本文にURLを入れていると http://tmpurl.com/何か のように、リンク先URLにUTF-8の文字が入っていると、rake generate してもページ生成に失敗します。その時のエラーメッセージは:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
unchanged sass/screen.scss
/usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/maruku-0.6.0/lib/maruku/input/parse_doc.rb:22:in `<top (required)>': iconv will be deprecated in the future, use String#encode instead.
Configuration from ~/_config.yml
Building site: source -> public
~/plugins/raw.rb:11:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
from ~/plugins/raw.rb:11:in `unwrap'
from ~/plugins/octopress_filters.rb:18:in `post_filter'
from ~/plugins/octopress_filters.rb:33:in `post_render'
from ~/plugins/post_filters.rb:124:in `block in post_render'
from ~/plugins/post_filters.rb:123:in `each'
from ~/plugins/post_filters.rb:123:in `post_render'
from ~/plugins/post_filters.rb:151:in `transform'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/convertible.rb:84:in `do_layout'
from ~/plugins/post_filters.rb:167:in `do_layout'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/post.rb:189:in `render'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:193:in `block in render'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:192:in `each'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:192:in `render'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/lib/jekyll/site.rb:40:in `process'
from /usr/local/Cellar/ruby/1.9.3-p327/lib/ruby/gems/1.9.1/gems/jekyll-0.11.2/bin/jekyll:250:in `<top (required)>'
from /usr/local/bin/jekyll:23:in `load'
from /usr/local/bin/jekyll:23:in `<main>'

対処方法は、URLをエンコードしておけばよいです。私は以下のTwitter投稿用ブックマークレットでリンク先をTwitter投稿フォームに表示させて、そのエンコードされたURLを使うことにしました。

1
javascript:(function()%7Bwindow.twttr=window.twttr%7C%7C%7B%7D;var%20D=550,A=450,C=screen.height,B=screen.width,H=Math.round((B/2)-(D/2)),G=0,F=document,E;if(C%3EA)%7BG=Math.round((C/2)-(A/2))%7Dwindow.twttr.shareWin=window.open('http://twitter.com/share','','left='+H+',top='+G+',width='+D+',height='+A+',personalbar=0,toolbar=0,scrollbars=1,resizable=1');E=F.createElement('script');E.src='http://platform.twitter.com/bookmarklets/share.js?v=1';F.getElementsByTagName('head')%5B0%5D.appendChild(E)%7D());

エラーメッセージからは、どのページがエラー原因なのかが分かりません。原因元の切り分けには、commentやdateなどがある投稿のヘッダにpublished: falseと書いて、そのページを生成対象から外して、エラーが生じるかを見ます。

iOS Bluetooth Low Energyの開発 その1

これは、岐阜人材育成講座でおこなった、CoreBluetoothフレームワークの解説の要約です。
白板は、以下の画像です:

Bluetooth Low Enerygとは

Bluetooth Low Energy(以下、BLEと省略)は、Bluetooth4で追加された超低消費電力の通信仕様です。例えば直径20mm 厚み3.2mmのコイン型1次リチウムイオン電池 CR2032 (3V 220mAh)で1〜2年間、接続してデータを送信し続ける状態での連続動作時間が得られます。

超低消費電力のRF通信規格には、BLEの他にANT, ANT+, ZigBeeなどがあります。BLEはBluetoothのブランド力、およびいち早くiPhoneおよびMacに採用されていることから、超低消費電力の通信規格として強い普及力があります。iPhoneに採用されたこと、またBluetoothに含まれることから、スマートフォンとの接続ではBLEが標準です。

Bluetooth4はBluetooth3にLow Energyの技術を追加したものです。Low Energyの技術は、それまでのBluetooth3とは全く別の技術です。そのため、Bluetooth3までの技術をクラシックBluetoothと呼び、Bluetooth Low Energyと区別することがあります。ここでもBluetooth3までの技術をクラシックBluetoothと呼びます。

クラシックBluetoothとBLEの使い分けは、必要な通信速度、製品製造コスト、電池の充電および交換が製品の利用場面に適しているか、などを考慮して決めます。

BLE、規格の狙い

BLEは

  • 超低消費電力
  • ペリフェラルが安価に作れる
  • BLEの認証のものとで、多種多様なペリフェラル開発が可能

を主眼に規格が作られています。

###超低消費電力
超低消費電力は、BLEの最も大きな狙いです。クラシックBTはリチウムイオン電池でも2週間程度で電池容量を使い果たすため、都度電池の交換もしくは充電が必要でした。この電池の交換および充電を実現するハードウェアは開発と製造にコストがかかります。またユーザに電池交換/充電を求めることが、クラシックBTが使える利用場面を狭めることがあります。

コイン型1次リチウムイオン電池 CR2032 (3V 220mAh)で1〜2年間、接続してデータを送信し続けるられるほどの超低消費電力であれば、電池が切れる=製品寿命とすることができますから、(ゴミの分別はおいておいて、いわゆる)使い捨てすら可能です。

BLEの超低消費電力は、クラシックBTと全く同じ機能を超低消費電力とするものではありません。物理的に電波を出して1ビットのデータを送受信するために必要な電力は、クラシックBTでもBLEでも、そうは違いはありません。

BLEは、例えば1秒に20バイト程度のデータを送受信するような、データのやり取り頻度は低いけれども、無線接続自体は長期間維持できる応用分野を想定した規格です。データ通信速度も物理層で1Mbpsです。クラシックBTは、ヘッドセットやパーソナル・エリア・ネットワーク(PAN)のような、特定の端末と接続すること(ペアリング)、常時データ通信があること、また高いデータ・レート(~3Mbps)が必要とされる、場面を想定した規格です。

このため、クラシックBTとBLEは、利用場面が全く違います。BLEは、Keyfobのように、常時スマートフォンと無線接続をし続けなければならないもの、またフィットネスの心拍センサーやセンサーネットワークのように、データ量は多くないが一定時間ごとにデータを収集し続ける応用分野に、非常に適しています。

###ペリフェラルが安価、また多種多様な開発が可能
BLEには、セントラルとペリフェラルという概念があります。通常、iPhoneがセントラル、心拍センサーなどの周辺装置がペリフェラルになります。無線通信をするためには、接続状態の管理や、パケットの送受信のタイミング制御などが必要になります。これには、CPUを使いますし、また電波の送信受信の電力も必要です。BLEは、ペリフェラルが安価に製造できるように、演算や電池を消費する機能をセントラルに寄せて、ペリフェラルが極めて簡単な構造ですむようにしています。

BLEのネットワークは、1つのセントラルに多数のペリフェラルが接続するピコネット、です。

クラシックBTとBLEでは、プロファイルの考え方が違います。クラシックBTは、通信の振る舞いとハードウェアの振る舞いをあわせてプロファイルとして定義していました。一方で、BLEはハードウェアの振る舞いは何も定義しません。

BLEはサービスという概念で、値の読み出しと書き出しの基本的な振る舞いのみを定義します。例えば電池残量のサービスは、電池残量の値読み出し方法と、その値の意味(ビット割り当てなど)の定義が与えられています。この電池残量のサービスは、様々なBLEデバイスが利用します。例えば、keyfobならば内蔵電池の残量通知に使います。これがもしも、電気自動車ならば、それは電気自動車の主電池残量を意味するでしょう。サービスという概念で、ハードウェアと切り離して定義されているので、抽象化され、サービスを多くの機器で横断して利用することができます。Custom Profile Development

BLEでは、128-bitのGUIDを割り当てたサービスを、開発者が独自に定義して実装することができます。従って、BLEは認証のもとで“任意のハードウェア”が開発できます。BLEでは、一般には定義されていない多種多様なハードウェアでも、独自に定義をすることで開発ができます。

BLEは、サービスを識別するIDに、16−bitのIDと128−bitのIDのいずれかを割り当てできます。16-bitは、BluetoothのSIGが定義したサービスに割り当てられます。このIDは勝手に定義して使うことは許されません。

クラシックBTでは、ハードウェアの振る舞いまで含めてプロファイルが定義されています。このため、プロファイルに定義されていないハードウェアの開発では、シリアルポートプロファイル(SPP)という、シリアル通信のプロファイルを使います。

クラシックBluetoothとBLE

クラシックBluetoothとBLEは、2.4GHzという同じ周波数帯を使っていますが、物理層の変調方式からして方式が違います。ですが、電波を送受信する回路(以下、RF回路)は、クラシックBluetoothとBLEで共用できます。したがって、BT3にBLEを追加したBT4の半導体は、コストの高いRF回路を別に設ける必要がなく、開発コストの利点があります。

Bluetooth SMART READYとSMART

BLE対応デバイスには、Bluetooth SMART READYとSMARTという2種類のロゴがあります。

BLEは、BT3にBLEを追加したものです。iPhoneのように、従来のクラシックBTとBLE両方に接続できる、いわゆる通常のBT4デバイスが、Bluetooth SMART READYになります。一方で、BLEしか実装していないデバイス、心拍計やkeyfobのようなペリフェラルも、BT4対応デバイスです。これはBLEでしか通信ができないので、Bluetooth SMARTと呼びます。

Bluetooth SMARTの製品は、Bluetooth SMART READYの製品と接続できます。ですがBluetooth(BT3以前のクラシックBT)とは接続ができません。Bluetooth SMART READYの製品は、すべてのBluetooth対応機器と接続ができます。ややこしいのですが、BLEだけ、を搭載したペリフェラル相当の機器にもBluetoothロゴをつけるための、区別です。

Bluetooth SMART READY/SMART対応機器のリストは、http://www.bluetooth.com/Pages/Bluetooth-Smart-Devices-List.aspx にあります。

シングルモードとデュアルモード

BLEでペリフェラルに対応する機器は、シングルモードとデュアルモードの2種類があります。シングルモードは、BLEのみを搭載したものをいいます。デュアルモードは、BLEに加えてクラシックBTにも接続できるものをいいます。デュアルモードは、通常、クラシックBTのシリアルポートプロファイル(SPP)でも接続できるように設計します。半導体メーカから、シングルモード、デュアルモード、それぞれのICが開発、提供されています。

シングルモードとデュアルモードのいずれにするかは、 接続する対応機器の範囲で決まります。もしもクラシックBTしか対応していない機器にも接続したい場合は、デュアルモードを選択するほか、手段はありません。また、連続してデータを送り続ける場合にも、デュアルモードを採用するかもしれません。BLEの通信速度は、物理層で1Mbps、実際の通信速度は~50kbps程度です。一方でクラシックBTは物理層で3Mbps(WiFiの物理層を使わないものであれば)で、~500kbps程度です。そもそも、そのような連続かつ高速のデータ送受信をし続ける応用例には、BLEを選択すること自体が、BLEの規格の狙い目からはずれていますから、クラシックBTのみで設計すればよいでしょう。

デュアルモードにすると決めると、自動的に、クラシックBTが要求する電池容量、また充電可能にするなどの、ハードウェアの設計要件が決まります。

もしも開発するハードウェアが、常時センサーを働かせるために電池の消費量が大きいならば、デュアルモードで設計しても、電池まわりはさほど違ったものにはならないでしょう。ですが、間欠的にセンサーを動作させるもので、電池交換や充電が不要で長期間動作することが、ユーザからみた装置の使い勝手や印象に影響するものであれば、デュアルモードにすることは、簡単ではないでしょう。

iOSのBLEデバイス開発

書くのがめんどくさくなったので、箇条書きで:

  • 2011年以降発売されたApple製品はBluetooth4対応。BLEデバイスと接続できる。
  • BLEデバイスの販売にMFiプログラムは必須ではない。ただしロゴを掲載したいなら参加が必要。
  • BLEデバイスと接続するアプリのストア承認にMFiは不要。ただし、アプリの動作を確認するために、BLEデバイスの提出が求められる、かもしれない。

BLEデバイスと接続するアプリケーションは:

  • 一般開発者ライセンスで提供されているCoreBluetoothフレームワークで開発する
  • アプリはバックグラウンドで動作させられる
  • iOS5までは、iPhoneはセントラルのみで動作する。
  • iOS6からは、iPhoneはセントラルおよびペリフェラルになれる。

つまり、テレビにもしもBLEリモコンがあったとすれば、iPhoneは任意のBLEリモコンを模倣できる。

応用例

コネクションレス型とコネクション型。BLEは基本コネクションして使うもの。

アドバタイズメント・パケットを利用して、近接検出のコネクションレスな利用ができる。同じデバイスからのアドバタイズメント・パケットを都度受信処理するためには、DuplicatesKeyをYESに設定する:

1
2
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
[centralManager_ scanForPeripheralsWithServices:nil options:options];

はまりどころ

通常のコネクションする使い方ならば、ハマるところはない。
強いて言えば:

  • CBPeripheralは自分でretainしないといけない
    • scanForPeripheralsWithServicesで取得したCBPeripheralはアプリ側でretainしないといけない
  • デバイスから強制定期にBluetoothの接続切断をすると、iOS6では、CoreBluetoothが例外を飛ばしてくる
    • try~catchして処理

このほか:

  • iPhoneが接続したことがないBLEデバイスのUUIDは、アドバタイズメント・パケット受信時はnull
    • iPhoneが、任意のアプリで一度でも接続したことがあれば、UUIDが取得できる。iPhoneの電源On/Offをしてもクリアされない。どっかにキャッシュをもっているのだろう。
  • iOS6では、iPhoneからBLE接続を切断しても、iPhoneは30秒〜1分程、BLE接続をもっている。このためBLEデバイスからアドバタイズメント・パケットが送出されない
    • アドバタイズメント・パケットを利用する場合は、デバイス側から強制的にBLE接続を切断する。

このように、細かい所で、iOS5とiOS6で振る舞いが違うところ、タイミングのパラメータ値が違うような些細だけど、使い方によっては致命的になる、ところがある。しらないと、はまるので、事前の確認をしっかりすること。

開発方法のおすすめ

BLEのハードウェア開発は、次章で述べるように、組み込み開発が必要になるために、どうしてもiOS単体で閉じた開発に比べて、時間がかかる。

iOS6では、たぶん、ペリフェラル側もiPhoneでプロトタイピングするのが、よいのではと思っている。BLEデバイスの開発には、ハードウェアそれ自体が特別なセンサーを利用しているか、またBLEの開発の中心は、ハードウェアなのかそれともデータ処理のアルゴリズムなのか、で区別してみる。

まずBLEが特殊なハードウェアを使うものであれば、iPhoneにそのハードウェアの機能がないので、プロトタイピングにはならない。しかしダミーデータを流す程度には使える。

BLE開発が、データ処理に価値がある場合がある。例えばフィットネス関連のBLEデバイスは、ほとんどが、加速度を使う。加速度から消費カロリーや歩数、高度の変化などを算出するのは、データ処理になる。このような、iPhoneにもあるハードウェアを利用し、その開発の工数の多くがデータ処理の場合には、iPhoneでのプロトタイピングは絶大であろう。

iPhoneでプロトタイピングしたソースコードをマイコンに移植すればよい。そのソースコードは、当然ながら、マイコンの性能に合わせて書きなおさなければならないかもしれないが。

BLEのデバイス自体は、とても簡単な回路ととても単純なデータ処理をする設計が多い。電力消費量とデバイスの大きさを考えれば、そのほとんどの処理はiPhone側に持たせたほうが、合理的で利点があるから。

BLEのハードウェア開発

BLEのデバイス開発は、組み込み装置の開発そのものです。ARM Cortex-M0のようなマイコンに、BLEのプロトコルスタックとユーザのアプリケーションを入れて、周辺のスイッチやLED、そしてセンサーを動かすハードウェアを開発していきます。

マイコンを利用する開発の難易度は、何を作りたいか、どう作るかの構想により、大きく違います。構想をたてる時点から、組み込み会社と協業していくことを、おすすめします。マイコン用の開発環境(IDE)があり、C言語で開発していきます。

ここでは、BLEのデバイス開発について、見ていきます。試作では、むき出しの基板に組み上げた回路でもよいでしょうが、実際には、筐体や商品パッケージ、取扱説明書など付随するものも必要です。ここでは、それらは考えません。

フルカスタム開発

半導体チップを購入して、ゼロから設計と開発をすることを、フルカスタム開発と呼びます。フルカスタム開発の設計の流れは:

  1. 半導体チップメーカからBLEの半導体を購入
  2. 半導体チップメーカの推奨設計例をもとにして、基板回路などを設計
  3. 電波法の認証 (試作では1台単位、製造では製造設備単位で認証が必要)

となります。製造まで考慮すると、製造時試験の手順決定と技術文書の作成など、多くの項目がありますが、ここでは省略しています。

BLEの半導体には、BLEの通信機能だけがあるものと、BLEの通信機能に加えてマイコンまで内蔵した、いわゆるSoC(システム・オン・チップ)の2種類があります。いずれを採用する場合でも、通信の制御にマイコンは必須です。

BLEの通信機能だけがあるものを使う場合は、その半導体とマイコンの間は、ホストコントロールインタフェースというBluetoothの規格に従ったプロトコルでやりとりをします。既存の製品にBLEを追加する場合で、すでに製品の中にあるマイコンで通信制御まで実現する場合には、この形を取ります。

SoCは、BLEのプロトコルスタックとユーザのアプリケーションが、BLEの半導体に内蔵された1つのマイコンで実行されます。回路面積を小さく、かつ消費電力を最小にできる利点があります。BLEデバイスをゼロから企画する場合で、大きさや電池の持ちに注目するときには、こちらを採用します。

CC2540を使ったファームウェア開発で、TI社のファーム焼きソフトを使っている場合、”データフラッシュの消去”をすると、CC2540のユーザ書き込みMACが0に初期化される。ドキュメントには、ユーザ指定のMACが0なら、メーカ書き込みのMACを使うとあるが、実際には、使っていない。ユーザのMACが0もしくは0xffいずれの場合も、その値を使ってしまう。すべてのデバイスのUUIDがおなじになり、個別識別ができない。ロット単位のエラッタなのかどうかは知らない。なので、フラッシュをクリアしてしまったときは、メーカ指定のMACをコピペで書き込んでおく。

モジュール

BLEの通信部分を入出力端子が外部に出ている小さな基板に収めたモジュールという部品があります。いろいろな会社からモジュールが出ています。

モジュールを採用する利点は、Bluetoothや電波法の認証を自社で取得する必要がないことです。一方で、モジュールの基板(大変小さくて、1cm角ですが)の形と大きさに製品が制約される場合があります。小型あるいは細長いようなBLEデバイスを開発するときには、モジュールの外形確認が必要になります。

モジュールは、Bluetoothの相互接続認証と電波法が求める工事認証を取得しているため、これを採用すればフルカスタム開発のファームウェア開発を除く手順が省けます。

2012年8月までは、モジュールの工事認証の条件に、モジュールが用意に着脱できること、という条件がありました。これを満たすため、モジュールには“コネクタ”がありました。しかし、2012年8月に、この条件が撤廃されたことで、直接ハンダ付けで固定する表面実装タイプの工事認証が通るようになっています。

BluetoothとMFiのロゴを掲載するには

Bluetooth対応のロゴ、およびMade for iPhoneのロゴを商品に掲載するには、それぞれBluetoothの相互接続認証の取得とMFiプログラムの参加が必要です。

Bluetoothは、認証費用自体は実費で5万円程度ですが、Bluetoothのメンバーに登録するための年会費が1万ドル必要です。自社で設計開発する場合は、自社でBluetoothの相互接続認証を取る必要があります。たいがいのモジュールは、Bluetoothの相互接続認証を取得しています。この場合は、そのモジュールを利用した派生製品であるとBluetooth対応製品のリストに無償で登録ができます。

Bluetoothのロゴを掲載しなくても、正体不明のRF装置として販売はできますが、iPhoneのようなBluetooth SMART READYな装置に接続することを表示するためには、Bluetoothのロゴは必要です。

iPhoneはBluetooth SMART READYなので、BLEデバイスはiPhoneに接続できます。このBLEデバイスの販売およびアプリのストア認証にMFiプログラムは必須ではありません。しかし、MFiのロゴを製品に掲載したいならば、MFiプログラムへの参加が必要です。

半導体チップについて

Bluetooth4対応デバイスは、従来の3までのBluetoothとLow Enery両方と接続できるデュアルモードと、 Low Energyだけに対応するシングルモードの2つにわけられる。iPhoneとBLEで接続するデバイスは、BLEのみに対応する、シングルモードデバイスになる。
シングルモードデバイスは、無線および制御回路を1つにした集積回路として、テキサス・インスツルメンツ、CSR、およびノルディック社の3社から販売されている。
TI社はCC2540およびCC2541の2つのシングルモード集積回路を販売している。価格は2ドル。8051マイコンを内臓しており、BTLEプロトコルスタックをIAR Embedded Workbench IDEのライブラリとして提供している。GPIOおよびADCなどの豊富なIOもあり、BLE接続センサーがワンチップで実現ができる。 CC2541は、BLEに加えてTI社およびノルディック社の独自2.4GHzデータ通信方式も対応している。この独自の無線通信は、例えばマウスやキーボードで独自の2.4GHzの通信仕様を利用している製品をBLEに移行するときに、従来の独自通信技術に対応させつつ、かつBLE対応が求められる場合に使われる。チップサイズは6mm角。

CC2540/2541の開発は、IAR Embedded Workbench 8051を使う。モバイルライセンス、フルセットで 35万円ほど、機能限定版で 25万ほど。また、保守(更新)は、最初3ヶ月は無料、年間更新料として購入価格の20%がかかる。
CSR社は、ウェブサイトで概略しか情報を公開していない。TI社のCC2540同じようなマイコンを内臓したものを販売している。BLEの開発部門はサムスンの出資をうけている。このため、純粋な半導体メーカとして続くのかは、不安に感じるところがある。
ノルディック社は、nRF8001およびnRF8002を販売している。nRF8001は、TI社のものと違い、BLEの プロトコルスタックまでを提供しており、制御はACIインタフェースをとおして別のマイコンで実現する。 nRF8002はnRF8001に、キーレスエントリーのようなキーホルダーに使われる近接等のプロファイルを実 装したもので、BLEで最もよく使われるキーホルダー的な機能が実現できる。チップの価格は3ドル程度 (Mouserで274円、80円/ドルより)。チップサイズは5mm角。
またCortex-M0+を搭載したSoC、nRF51シリーズを発表している。ノルディック社が提供してきた独自規格の2.4GHz通信とBLEに対応したものが出荷されている。この開発環境はKeil MDK-ARMを使います。このライセンス料金は、30万円程度です。このSoCのファームウェア開発方法は、ARM Cortex-M0+の手順そのままです。

モジュール

この他に、BlueGiga社はTI社のCC2540を採用したモジュールを販売しています。このモジュールは、IAR WorkbenchのようなC言語開発環境の代わりに、BASICのようなスクリプト開発環境を独自に提供している特徴があります。また、FCCとCEを取得しており、Bluetoothの相互接続認証を取得しています。ですからBluetooth対応の製品リストに無償で登録ができるので、Bluetoothのロゴを表示して販売ができます。

許認可の取得

Bluetooth4 Low Energy機器を販売するためには、販売国での認証取得が必須です。この認証は、電波を 放出する機器が他の機器の動作を阻害しないことを承認することで、無線局免許がなくても電波を発する無 線装置を運用してよいという制度が求めるものです。この認証なく電波を発した場合は、日本では使用者が 電波法違反を問われます。
Bluetoothのロゴを掲載するには、Bluetoothの団体に加入して、機器相互接続試験をクリアしなければな りません。ロゴを掲載せずBluetooth機器だといわないならば、これを取得していなくても、販売は可能で す。プロファイルによりますが、150~250万円程度がかかります。
この認証は、米国ではFCC、日本ではTELEC、欧州ではCE、と呼ばれます。FCCおよびCEは、一般的な 電気機器にもとめられるEMC(電磁両立性、電気機器などが備える、電磁的な不干渉性および耐性)も必要になります。

EMC試験および無線機器の認証取得代理を提供している会社がいくつかあります。試験および書類申請までを一貫してサービスとして提供しています。回路や電波の技術と法律の両面の知識が必要で専門職でなければ対応は難しいので、設計段階から、相談をしておくことが大切です。

電波を出す製品を米国、日本、欧米で販売するための許認可は、それぞれFCC、工事認証、CEになります。設計したものが基準を満たせず再試験になった場合には、その追加費用など、付随する費用発生がありますが、最低限必要な費用なの目安は:

  • FCC 165万円くらい
    • EMC(9kHzを超える) 40~50万円
    • 無線に関わるもの(Part15 sub C、電磁障害なきこと) 80万円
    • 米国への書類提出など 25万円
  • 日本 48万円くらい(書類作成、申請代行費用は含まず)
    • 工事認証(工場生産単位での認証) 48万円
  • CE 合計220万円くらい
    • EMC 100万円
    • 無線関連(障害なきこと) 80~90万円
    • 電気機器の安全性確認 30万円
      • 認証に提出するデータは、量産と同じもので計測されたものを提出します。

製造設備および体制に対して、 求められるものは:

  • FCC
    • 特に無い
  • 日本
    • 製造されたものの特性が同一であること、そのために品質が管理されていることを書類で明らかにする。
    • 具体的にはISOを取得している、出荷時検査の装置や測定手順が決められていてデータが保存されているなどの、体制の整備が審査対象になる。
  • CE
    • 特に無い
    • しかし、各国で抜き取り調査をしている。もしも違反している場合は、製品の全数回収の義務が生じる。また罰金が課せられる。

ここでは書いていないこと

ぶっちゃけです。

AndroidとWindows Phone8でのBLE対応アプリ開発

BLEのAndoridのプロトコルスタックは、Googleから公式に提供はされていない。ADK2.0でBLEをつけているのにと思っても、ぶっちゃけあれはデュアルモードなので。モトローラなど、半導体もやっているところや、BLE開発を先行して進めている会社がそれぞれ自社の名前空間でBLE対応のプロトコルスタックを出している。BT4対応のハードか否かも、機種依存で、プロトコルスタックもカオス。近づいたら火傷しそうな落とし穴を、考えつく限り散りばめた、カオスすぎる状況。

Windows Phone8は、ハードウェア要件にBT4必須がない。Windows8のハードウェア要件にはBT4必須があるので、Phoneでは違うんだ、に気をつけておかないと、混同しやすくて危ない。スタックは、Windowsと同じなので、使いやすいかも。特定プロファイルの実装はあったけど、128-bitな独自のサービスにも対応できるかは調べがついていない。

会社の作り方

法人を作ってみる

個人事業主として、http://d.hatena.ne.jp/feb-hare/20110710/1310263186:titlehttp://d.hatena.ne.jp/feb-hare/20120224/1330062063:titleのように、3年間やってきたのですが、この先10年20年を考えると、自分が動かなければ何も動かない個人という立ち位置は、事業としてはやりにくいかなと思えてきました。

アイディアに比重が大きい開発などの属人性が強いものは今後も個人事業主としてやっていくとして、そのライセンス販売や商標などの権利の管理と運用は、個人とは切り離した存在、法人、でやっていきたいと思いました。

そこで、法人を作ってみることにしました。

法人のメリットは:

  • 所得が1000万円程度を超えるなら、必要経費と課税金額が、個人よりも小さい
  • 社会の扱いでも法律のうえでも、個人と事業を分離できる
  • 個人は無限責任だが、(株式もしくは合同なら)法人は有限責任

個人事業主が法人を作ることを、法人成りといいます。事業所得が1000万円ほどになると、個人よりも法人のほうが税金が安くで済むようになるので、個人で稼げる人は節税目的で法人を作る事が多いそうで、それを将棋の駒に例えて法人成りと呼びます。

法人は、法律では、ふつうの生きている人、自然人と同格の存在です。憲法の生存権や選挙権はないですが、財産を所有し、労働をして、納税をする存在です。将来、人格をもつ人工知能と人間のような外観のロボットが実用になったとき、ロボットそれぞれが法人格をもつだろうなと思っています。

法律上は、法人は自然人と同格の存在ですから、そこに集めたお金をそこに持たせて、そのお金で、人を組織し、物を動かして、何かしらの価値を生み出す器として使えるわけです。Fate stay nightでいう、万能の願望を叶える器として、利用できるわけです。

法人の詳細は、国ごとの法律で異なります。日本に、平成17年に改定された会社法で、株式、合同、合資、合名会社の4種類が述べられています。このうち株式と合同の2つは、もしも会社が解散したり借金をしても、出資をした社員は、出資金以上の責任を負わない有限責任です。個人事業主は無限責任です。負うべきリスクが出資金として明確に見えるのは、法人の大きな利点でしょう。

また、ハードウェアを製造販売しようとすると、PL法は避けて通れません。そしてPL法に対応して万が一の場合に備えて保険をかけようとすると、個人ではできず、法人格が必要になります。このように、どうしても法人格が必要になる場面もあるので、このような利点もあります。

株式会社と合同会社

平成17年の改定により、一人でも株式会社が設立できるようになりました。また資本金の最低額が撤廃されたので資本金1円でも会社を設立できます。

株式会社は、会社の所有(資本)と経営を分離して運用される会社です。会社の価値を、株、という小口の証券にして、そして集めた資本を経営者が運用して余剰利益を配当していくのが、株式会社です。会社の価値が株という形で小口化してあるので、外部から資本を入れて事業を大きくしていくのに向いています。この運用のための様々な工夫が、機関の設計や、株式の種類などとして、会社法に規定されています。

合同会社は、この資本と経営が分離されていない会社です。社員はそれぞれ資本を持ち寄り、合同で事業をすすめます。また経営の進め方や利益配分などのルールを、自由に設計できます。ですから、外部から資本を集める必要がない場合、また、お金はないけれど知恵や腕がある人と、対等の利益配分率で事業をすすめる場合など、株式会社の形でやる必要がない、またはやりにくい事業が、合同会社としての運用が適しています。ですが、成長すると、ほぼ間違いなく、もめるか、株式会社にするかするでしょうが。

設立の時点あるいは設立してから、資金を出すだけの人(もしくは法人)が出てくると思うなら、最初から株式会社で設立するのが、よいでしょう。

個人で規模の拡大をしないのであれば、合同会社でいいでしょう。会社は、合同会社を株式会社にしたり、逆に株式会社を合同会社にする組織変更ができます。まずは合同会社で創立して、めどが付いたら株式会社にしても、いいかもしれません。

登記の実際、いかに家から出ないか

ここでは、実際に合同会社を作るまでの手順を紹介します。テーマは、いかに家から外に出ないか、を目的とします。会社登記は、自分でやるか、他人の申請を代理できる資格である司法書士や弁護士の方に依頼するか、のいずれかです。法律の知識が必要で、また登記は1度やればそう滅多とするものではないので、専門家に依頼するのが、時間と費用でメリットがあります。

特におすすめなのは、http://www.hitodeki.com/:titleです。ここは、法律の知識がない人では対応が難しい書類作成と申請手順の一部分を定額かつとても安価に提供しています。また、申請手順もウェブで丁寧に説明されています。合同会社の事務手数料は1万円です。以下の手順を自分でやると、1週間はかかりますから、自分でやることが楽しい、あるいは挑戦してみたい人以外は、ここを使うほうがメリットがあるでしょう。

このサイトは、登記の書類をオンラインで作成して、その書類をユーザがプリントアウトして窓口に提出する手順を踏みます。登記の書類は、必要な項目をウェブで埋めていけば、テンプレートに流しこみ生成されます。あとは、行政書士が電子署名をした印紙代がかからない電子定款と、印刷して提出するだけの書類一式の電子ファイルが入手できるので、それを窓口に持っていくだけです。また、設立後は、税務、労務それぞれの専門家が必要ですが、それも紹介してくれるので、すぐに事業を始めたい場合には、よいと思います。

自分で登記をするコストの利点

自分で登記をすれば、行政書士の方に支払う費用が不要で安いのですが、法律に従った書類を準備するための学習時間と電子署名をする準備とその署名の手間を考えると、先ほどのオンラインのサービス等を利用したほうが、よいでしょう。http://www.hitodeki.com/:titleなら1万円、街の行政書士に依頼しても、5万円かその程度です。

ここでは、登記にかかる費用を簡単に説明します。まず、定款、にかかる費用があります。

株式会社の定款は、会社法により、定款を公証人に承認してもらわなくてはなりません。この費用は5万円ですhttp://www.koshonin.gr.jp/tei.html#05:title。また定款を紙文書にした場合は、http://law.e-gov.go.jp/htmldata/S42/S42HO023.html:title 別表1の4万円の印紙が必要です。定款を電子ファイルにしたときは、この印紙は不要です。

公証人役場で定款の認証をうけるときは、必ず対面で本人であることを確認してから、渡すことが、決められています。これは、紙書類でも電子ファイルでも、同じです。電子ファイルで定款を提出するときは、まず定款を作成して、それに電子認証局が発行する鍵で電子署名をして、公証人役場に提出します。この”電子認証局”の鍵は、いわゆる住基カードの公的個人認証サービスとは別のものです。民間業者から鍵を発行してもらうと2年間有効なものが費用1.5万円かかります。(訂正:2012年11月15日。公的個人認証サービスの電子署名で、受け付けてもらえるそうです。)

そして、公証人役場への電子ファイル送付は、法務局の登記ねっとのソフトを使い、オンライン申請できます。ですが、先ほどのように対面で本人と確認してから手渡すため、電子ファイルを提出した後に、公証人役場に電話連絡をして、その日時や手順を相談して決めなければなりません。そして、電子認証局で電子署名した定款を公証人役場に送付した後、リアルに窓口にいくと、公証人役場で認証した定款の電子ファイルを、フロッピーディスクもしくはCD-R(公証人役場によってはDVD-Rは受け付けないところもあるみたいです。まさかと思うようなことですが、使える媒体は電話した時に確認しておくほうがいいです)に入れてもらって、受け取り完了です。

株式会社の定款は、このような手間がかかるのと、行政書士が持っている電子署名が必要なので、定款作成とセットで依頼したほうが楽です。

ネットの定款作成で、やたら費用がかかるようにいっているのは、1)電子署名にかかるソフトや鍵の費用、2)印紙代、をごちゃまぜで言っているようです。まず電子署名はAdobe Acrobatをつかうほかありません (法務局が出しているプラグインがAdobe Acrobat対応のプラグインなので)。これが5万円ほどです。そして、一般人が電子認証局の鍵を買うと、2年有効なものしかなく、これが1.5万円です。あわせて、6.5万円します。また印紙税は、紙書類であれば必要ですが、電子署名にすれば不要です。

ですから、一般人であれば、紙で出せば4万円、電子署名なら6.5万円(+ソフト設定の手間)のいずれかの選択になるが、行政書士に依頼すれば、電子署名は日常業務でやっているので、電子定款を作り、それで浮いた印紙代4万円くらいを、手間賃でもらいます、という感じです。[http://www.hitodeki.com/:title]だと、その電子署名の手間賃が5000円なので、定款を受け取る側からすれば署名自体に意味はない、仕組みでしか無いので、それでいいだろうと思いますが。

ですから、株式会社は定款作成と認証に、5万円+定款作成と電子署名費用(5000円~)が必要です。

合同会社は、定款の認証が必要ありません。ですから、この認証費用5万円は不要です。また、法務局に登記ねっとで自分でオンライン申請する場合は、定款の電子署名を自分の住基カードの公的個人認証サービスでかけることで、定款の電子署名のコストも必要ありません。Adobe Acrobatは、インストールしてから1ヶ月はお試し期間で使えるので、登記の期間がそれを超える場合は、購入のための費用が必要ですが。

ですから、合同会社は定款作成は、0円です。

登記の残りのコストは、登記の必要書類の作成手間賃、そして登録免許税です。登録免許税は、株式会社で15万円(あるいは資本金の0.7%のいずれか大きい方)、合同会社で6万円(もしくは資本金の0.7%)です。登記ねっとでオンライン申請する場合、平成25年度まで、3000円減じる特例処置があります http://www.moj.go.jp/content/000011324.pdf:title

これらの合計が、登記のコストです。株式会社なら、定款と書類作成で手間賃1万円+電子署名0.5万円+認証5万円+登録税15万円で、21万円くらい。合同会社なら、定款作成手間賃1万円+登録税6万円で7万円くらいです。

登記と維持費

法人を作った後の維持費は、税金と、事務手数料です。税金は、個人事業主と同じく、所得に対する課税、消費税、住民税、があります。個人事業主では、赤字の場合は住民税は免除されますが、法人は赤字でも7万円の住民税が発生します。

事務手数料には、税理士報酬があります。個人事業主の延長の規模であれば、毎月1.5~3万円程度、決算は月料金の3倍程度が目安です。年間30万円ほどでしょう。

もしも普通自動車を所有していれば、その年間維持費用は(重量税5+保険5+車検10/2+車両本体償却150/10)=30万円、ですから、自動車1台持っていると思えば、いいでしょう。

登記の流れ

ここでは、法務局の登記ねっと、を利用してオンライン申請をします。必要な手順は、1)登記の書類を作る、2)オンラインで申請する、の2点です。前者は、申請手段が、窓口かオンラインかにかかわらず、必要な手順です。後者は、申請の手順です。

はんこを作る

会社の実印を作っておきます。実印は、法的な契約に万能の威力を持つので、おいそれと人の目に晒すわけにはいきません。ですから、銀行口座のための銀行印、そして見積書などに押す角印も一緒に作っておきます。法人設立の3本セットとして、5000円から、1万円もしない程度で製作してもらえます。製作期間は1週間はかからないでしょう。私は、印章をメールで事前確認ができて、お安かった、はんこの森、を利用しました。

登記の書類を作る

説明がめんどくさいので、説明を端折ります。ググってテンプレを入手するなり、会社法なり解説本で勉強するなりして、以下の書類を作ります。書類の作成順序は、定款を作ってから、資本金を決定して、払い込む、流れなので、書類の日付がその順番になっている(同じ日でもいいが、前後しない)ことに注意します:

  • 定款
  • 資本金決定書
  • 代表者印の印鑑証明書
  • 払込証明書
  • 資本金の額の形状に関する証明書

まずは定款と、資本金決定書のファイルを作って日付を入れてPDFファイル化しておきます。そして、適当な通帳を空っぽにして、通帳にだれが振り込んだか、名前を残すために、そこに資本金を銀行振込します。

家から1回外に出る

翌日、通帳に振込が完了してから、市役所に行き以下の手順を行います:

  • 住基カードを作る、電子証明書を入れてもらう(手数料、1000円)
  • 印鑑証明書を取る
  • カードリーダを購入する
  • 通帳のコピーを取る
  • (印章のコピーを取る)

まず、住基カードのICチップに電子証明書を入れてもらいます。役場により、住基カードは、接触と非接触に対応したコンボ型か、接触のみのものか、いずれかです。住基カードの説明書に、カードのタイプは明記されています。そのカードのタイプに対応した、カードリーダを入手します。私の場合は、非接触も対応していたので、e-taxに使うかと思って買っておいた、手持ちの非接触ICカードリーダが使えました。SUICAカードが読める、ソニーとかの製品であれば、大抵使えるでしょう。

市役所に行ったついでに、個人の印鑑証明書を1通取得します。もしも印鑑登録をしていないなら、実印登録のための個人の印鑑を準備して、印鑑登録しておきます。

最後に、資本金の支払い証明のために通帳のコピーを、表紙、裏表紙、払込記録部分、の3枚を取ります。500円ほどで作ったもらえる残高証明書でもよいです。私は、コンビニの白黒コピーをとって、それを書類スキャナで取り込みました。セブンイレブンのコピー機なら、コピー機から直接メモリカードにPDFで保存するサービスがあります。もしも家に書類スキャナがない場合は、このサービスを利用します。価格は1枚30円です。またPDFファイルを保存するための、USBメモリを忘れず持っていきます。また、通帳は余白部分が多いと、自動で空白削除されかねないので、コピーはA4サイズ指定、かつA4の領域の真ん中に通帳をおいて、確実に通帳全体のコピーを取ります。

もしも書類スキャナがないなら、印章のコピーもとっておきます。

申請する

必要書類をPDFで作成しておきます。

定款だけは、電子署名します。法務局の登記ねっとから、PDF署名プラグインをダウンロードして、住基カードをリーダに設定してから、プラグインを設定します。署名時に印章の画像を入れられます。これは印章のPDFファイルを指定しておこないます。このプラグインだからか走りませんが、このPDFの印章は170mm角の領域に収まる前提らしく、私は印章を600dpiで取り込み、MacのiDrawでdpi指定してPDF出力して。170mm角に収まるようにしてPDF出力しました。べつに、印章を画像貼り付けしておき、その領域の上に電子署名をしておけば、目的は満たすと思いますが、あえてツールの使い方にこだわってみました。

あとは、登記ねっとのガイダンスどおりに、申請項目を埋めて、作成したPDFファイルを添付して、申請ボタンを押せばOKです。申請時点で、申請書および添付ファイルにたいして、住基カードの公的個人認証サービスの電子署名がされて、送信されます。

書類を送信してから、翌日から3営業日以内に、登録免許税を支払います。私は電子納付をしました。ジャパンネット銀行およびソニー銀行といった、ネット専業銀行は使えなかったので、ネットバンキングが使えるようにしてあった三井住友銀行の個人口座を利用しました。

家から2回目の外に出る(150円の差額で、出なくてもすむ)

申請と振込が完了したら、残るは個人の印鑑証明書と、法人の印鑑申請を、法務局に申請します。印鑑(改変)届書は、PDFを印刷、必要箇所を記入します。登記の個人の印鑑証明と併用するために、真ん中より下あたりのレ点(注意1のぶぶん)をチェックしておきます。

登記ねっとのソフトの、メニューの、アクションから、”書面により提出した添付情報の内訳表の印刷”でHTMLファイルを出力して、その項目リストのうち、印鑑証明だけを残して、後の項目を削除したものを作ります。これを印刷して、先ほどの印鑑届書と、個人の印鑑証明書を重ねて、左側をホッチキスで止めます。これを、法務局の管轄支部に郵送します。

印鑑証明書は信書に分類されるため、ヤマト運輸のメール便、もしくは宅配便は郵便法により利用できません http://www.soumu.go.jp/menu_kyotsuu/important/topics091210.html。郵送は、郵便局窓口から、(簡易)書留でだします。簡易書留の料金は、総量120円+書留料金300円で、420円です。レターパックだと、500円ですが、集荷してくれるので、家からでなくてもすみます。350円のレターパックライトだと、集荷をしてくれないので、窓口に行く必要があります。

家から外に出て郵便局窓口にいくなら、350円のレターパックライト、集荷を依頼するなら500円のレターパックを利用しましょう。

設立後の手続き

法人を設立したら、税務関係の届出、社会保険事務局に健康保険と厚生年金への加入の届出、もしも人を雇うなら労働基準監督署への届出、が必要です。
税務署関連は:

  • 法人設立届 (設立2ヶ月以内)
  • 青色申告の承認申請 (設立から3ヶ月経過した後か、事業年度終了日のいずれか早い方の前日)
  • 減価償却資産の償却方法の届出書 (第1期の確定申告の提出期限)
  • 棚卸資産の評価方法の届出書(第1期の確定申告の提出期限)
  • 給与支払い事務所の開設届出書 (支払事務所の設立から1ヶ月以内)
  • 源泉徴収の納期の特例の承認に関する申請書 (特例を受けようとする月の前月末まで)

の届出や申告があります。
このうち、法人設立届出をまずはします。

法人設立届出書をだす

法人設立届出書は、e-Taxでも出せると書いてありました。試しに試みると、e-Taxのウェブアプリでは申請項目がありません。e-Taxソフトで申請書類を送信できました。しかし、送信する権限がないと、メッセージで通知されました。公的個人認証サービスの電子署名では、通らないのかもしれません。
仕方ないので郵送しました。国税局のサイトから、PDFの申請書類を印刷して、必要書類を揃えて、所轄の税務署に提出すれば、よいだけです。必要な書類をどう書けばいいのかは、ネットで調べると、ひな形などの情報が出てきます。
法務局への郵送の時と同じく、これらの届出や申請書は信書に相当するので、クロネコヤマトメール便は使えません。普通郵便もしくはレターパックを利用します。
申請書のコピーと返信用封筒を同封して、コピーに受付印を押してもらって返信をくださいと一筆書いておくといいです。
この届出には、登記簿謄本が必要です。これはhttp://www1.touki.or.jp:titleを利用すると、オンラインで登記簿を取得できます。手数料は400円です。オンラインで受け付けるものは、これを利用すると便利です。
紙の登記簿謄本を入手する方法は、法務局窓口で紙の登記簿謄本を取得すると700円、予め登記ネットで登記簿の発行を申請してから窓口で受け取ると570円、郵送を依頼した場合は+送料、の費用になります。