2007年 03月 21日

Bluetooth on Cocoa, OS X

ケータイでとった写真を自動でかきあつめて日付別にディレクトリにつっこみたかったので Bluetooth をいぢってみた。

いつものとおり RubyCocoa さん

require "osx/cocoa"
include OSX
NSBundle.bundleWithPath("/System/Library/Frameworks/IOBluetooth.framework").load
OSX.ns_import :IOBluetoothObject
OSX.ns_import :IOBluetoothDevice
OSX.ns_import :IOBluetoothOBEXSession
OSX.ns_import :OBEXFileTransferServices


#NSBundle.bundleWithPath("/System/Library/Frameworks/IOBluetoothUI.framework").load
#OSX.ns_import :IOBluetoothDeviceSelectorController
#p OSX::IOBluetoothDeviceSelectorController.deviceSelector.runModal
#

def log(*args)
	OSX.NSLog(args.map {|o| o.inspect }.join("¥n")+"¥n")
end

class Main < NSObject
	def init
		self
	end

	def applicationDidFinishLaunching(aNotification)
		IOBluetoothDevice.pairedDevices.each do |d|
			log d.getAddressString.to_s
			log d.getName.to_s
			d.getServices.each do |s|
				log s.getServiceName.to_s
			end
		end

		target = "Nyece"
		@device = IOBluetoothDevice.pairedDevices.find {|d| d.getName.to_s == target }
		#@device.openConnection

		@session = IOBluetoothOBEXSession.withDevice_channelID(@device, 10)

		@ftp = OBEXFileTransferServices.alloc.initWithOBEXSession(@session)
		@ftp.setDelegate(self)
		log @ftp.delegate
		log @ftp
		log @ftp.isConnected?
		log @ftp.connectToFTPService
	end

	def fileTransferServicesConnectionComplete_error(service, error)
		log "FTP Connected"
		log @ftp.currentPath
		@ftp.retrieveFolderListing
	end

	def fileTransferServicesRetrieveFolderListingComplete_error_listing(service, error, listing)
		log "ls complete"
		log listing.to_a
		log @ftp.disconnect
		#@device.closeConnection
	end
end

app = OSX::NSApplication.sharedApplication
app.setDelegate(Main.alloc.init)
trap('SIGINT') { exit 0 }
app.run

が、BUS Error ( fileTransferServicesConnectionComplete_error の呼びだしで落ちてる ) うまくいかない。orz
obj-c で書いたほうがはやいだろうなぁ。でもなんかそれは負けた気がする。

わかったこと

  • ファイルのやりとりは OBEX っていう転送プロトコルがつかわれる (IrDA と同じらしい)
  • OBEXFileTransferServices は自分で openConnection しなくても勝手にひらいてくれる
  • ファイルのやりとりいがいはたぶん OBEXSession を直接つかって open & delegate するのかな。

プロトコル調べるのがめんどい。

アプリケーションバンドル化してみたけどやぱ BUS Error で落ちる。むりか。